「这是我参与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]
测试用例
示例 1:
输入:arr = [2,1]
输出:false
示例 2:
输入:arr = [0,3,2,1]
输出:true
参数限制
1 <= arr.length <= 1040 <= 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;
}
};
结果表明,这种算法对单调类型的数组无法区分,再次分析,发现算法的缺陷在于,对单调自增的数组,误判山峰坐标在 arr.length-1, 单调递减的数列,误判山峰坐标在 0,我们直接在返回的条件里追加对 l, r 的下标判断即可
修改后
return l == r;
// -->
return l == r && l >0 && r < arr.length - 1;
今天的力扣刷题就分享到这里,感谢大家的阅读~