941. 有效的山脉数组

177 阅读1分钟

方法一:双指针

  • 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;
    }
}