941. 有效的山脉数组
941. 有效的山脉数组
题目
Given an array of integers arr
, return true
if and only if it is a valid mountain array.
Recall that arr is a mountain array if and only if:
arr.length >= 3
- There exists some
i
with0 < i < arr.length - 1
such that:arr[0] < arr[1] < ... < arr[i - 1] < arr[i]
arr[i] > arr[i + 1] > ... > arr[arr.length - 1]
Example 1:
Input: arr = [2,1]
Output: false
Example 2:
Input: arr = [3,5,5]
Output: false
Example 3:
Input: arr = [0,3,2,1]
Output: true
Constraints:
1 <= arr.length <= 10^4
0 <= arr[i] <= 10^4
题目大意
给定一个整数数组 arr
,如果它是有效的山脉数组就返回 true
,否则返回 false
。
让我们回顾一下,如果 arr
满足下述条件,那么它是一个山脉数组:
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 = [3,5,5]
输出: false
示例 3:
输入: arr = [0,3,2,1]
输出: true
提示:
1 <= arr.length <= 10^4
0 <= arr[i] <= 10^4
解题思路
可以通过一次线性遍历完成检查:
- 找到递增部分:从左到右遍历数组,找到峰顶
i
。 - 找到递减部分:从峰顶
i
继续遍历,找到递减结束的位置。 - 检查有效性:
- 峰顶
i
不能是数组的第一个或最后一个元素。 - 最后递减部分的终点必须是数组末尾。
- 峰顶
复杂度分析
- 时间复杂度:
O(n)
,需要遍历数组一次。 - 空间复杂度:
O(1)
,仅使用常数级额外空间。
代码
/**
* @param {number[]} arr
* @return {boolean}
*/
var validMountainArray = function (arr) {
const n = arr.length;
if (n < 3) return false;
let i = 0;
// 找到上升的部分
while (i + 1 < n && arr[i] < arr[i + 1]) {
i++;
}
// 如果峰顶是第一个或最后一个元素,则不是山脉数组
if (i === 0 || i === n - 1) return false;
// 找到下降的部分
while (i + 1 < n && arr[i] > arr[i + 1]) {
i++;
}
// 如果遍历完整个数组,说明是山脉数组
return i === n - 1;
};
相关题目
题号 | 标题 | 题解 | 标签 | 难度 | 力扣 |
---|---|---|---|---|---|
1671 | 得到山形数组的最少删除次数 | [✓] | 贪心 数组 二分查找 1+ | 🔴 | 🀄️ 🔗 |
2865 | 美丽塔 I | 栈 数组 单调栈 | 🟠 | 🀄️ 🔗 |