LeetCode/941. 有效的山脉数组

941. 有效的山脉数组

给定一个整数数组 A,如果它是有效的山脉数组就返回 true,否则返回 false

让我们回顾一下,如果 A 满足下述条件,那么它是一个山脉数组:

  • A.length >= 3
  • 0 < i < A.length - 1 条件下,存在 i 使得:
    • A[0] < A[1] < ... A[i-1] < A[i]
    • A[i] > A[i+1] > ... > A[A.length - 1]

示例 1:

1
2
输入:[2,1]
输出:false

示例 2:

1
2
输入:[3,5,5]
输出:false

示例 3:

1
2
输入:[0,3,2,1]
输出:true

提示:

  1. 0 <= A.length <= 10000
  2. 0 <= A[i] <= 10000

来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解:

本题没有什么特殊的,就前后两个指针,left指针向后遍历,遇到后一个比前一个大的,就继续下一个,如果后一个等于或小于前一个,就跳出循环;right指针从前往后遍历,遇到前一个大于后一个的,向前遍历,如果前一个小于或等于后一个的,直接跳出循环。最后判断leftright指针是否相等,如果不相等,直接返回false,如果相等,我们需要注意两种特殊情况,即[0,1,2,3,4,5,6,7,8,9][9,8,7,6,5,4,3,2,1,0],这两种情况下,我们只需要判断left是否等于A.length - 1或者是right是否等于0即可。

具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class Solution {
public boolean validMountainArray(int[] A) {
if (A.length < 3)
return false;

int left = 0, right = A.length - 1;
//左指针后移,判断后一个是否大于前一个
while (left < A.length - 1) {
if (A[left] < A[left + 1]) {
left++;
} else {
break;
}
}

//右指针前移,判断前一个是否大于后一个
while (right > 0 && left != right) {
if (A[right] < A[right - 1]) {
right--;
} else {
break;
}
}

//判断两个指针是否相遇
if (left == right) {
//判读两种特殊情况
if (left == A.length - 1 || right == 0)
return false;
else
return true;
} else {
return false;
}
}
}

Comments