【力扣刷题】941. 有效的山脉数组

218 阅读1分钟

「这是我参与11月更文挑战的第 10 天,活动详情查看:2021最后一次更文挑战

原题链接

941. 有效的山脉数组 - 力扣(LeetCode) (leetcode-cn.com)

题目描述

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

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

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

image.png

测试用例

示例 1:

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

示例 2:

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

参数限制

  • 1 <= arr.length <= 104
  • 0 <= arr[i] <= 104

分析

示意图特地标识了,山脉数组中不允许出现相邻且且相等的数据

我们对一个数组从头遍历到尾,一旦发现超过1个起伏的节点,亦或者直接就是单调递增或者单调递减的数据模式,就需要返回 false

那么,我们换一个思路,第一次从左往右遍历数组,找到一个坐标点 l,有 arr[l-1]<arr[l] && arr[l+1]<arr[l];然后我们开始第二次遍历,顺序从右往左,找到一个坐标点 r,有 arr[r-1]<arr[r] && arr[r+1]<arr[r];最后,如果 l==r 即表示我们找到了唯一的一个山峰

代码

var validMountainArray = function(arr) {
    if (arr.length < 3) return false;
    for (let l = 0, r = arr.length - 1;;) {
        if (arr[l] < arr[l + 1]) {
            l++;
            continue;
        }
        if (arr[r] < arr[r - 1]) {
            r--;
            continue;
        }
        return l == r;
    }
};

image.png

结果表明,这种算法对单调类型的数组无法区分,再次分析,发现算法的缺陷在于,对单调自增的数组,误判山峰坐标在 arr.length-1, 单调递减的数列,误判山峰坐标在 0,我们直接在返回的条件里追加对 l, r 的下标判断即可

修改后

return l == r;
// -->
return l == r && l >0  && r < arr.length - 1;

今天的力扣刷题就分享到这里,感谢大家的阅读~