方法一:双指针
- i从最左边往右扫,直到不满足条件。
- j从最右边往左扫,直到不满足条件。
- 如果是山脉数组,则i和j必然相遇在山峰处。
class Solution {
public boolean validMountainArray(int[] arr) {
int i = 0, j = arr.length - 1;
while (i + 1 < arr.length && arr[i + 1] > arr[i]) {
i++;
}
while (j - 1 >= 0 && arr[j - 1] > arr[j]) {
j--;
}
// 1,2,3,4,5 5,4,3,2,1
if (i == j && i != 0 && j != arr.length - 1) {
return true;
} else {
return false;
}
}
}
方法二:单指针
i从最左边往右扫,先判断上坡,再判断下坡。
class Solution {
public boolean validMountainArray(int[] arr) {
int i = 1;
while (i <= arr.length - 1 && arr[i] > arr[i - 1]) {
i++;
}
//1. 一直递增到末尾 2. 出现前后两个相等的 3. i没动过,如[2,1]
if (i == arr.length || arr[i] == arr[i - 1] || i == 1) {
return false;
}
//到这里,i是最大值后面一位
while (i <= arr.length - 1 && arr[i] < arr[i - 1]) {
i++;
}
// if (i <= arr.length - 1 && arr[i] >= arr[i - 1]) {//&&前面防止i越界
// return false;
// }
//简单版:如果上面的while能成功执行完毕,则i必然走到最后一位,
return i == arr.length;
// return true;
}
}