跳至主要內容

941. 有效的山脉数组


941. 有效的山脉数组

🟢   🔖  数组  🔗 力扣open in new window LeetCodeopen in new window

题目

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 with 0 < 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

解题思路

可以通过一次线性遍历完成检查:

  1. 找到递增部分:从左到右遍历数组,找到峰顶 i
  2. 找到递减部分:从峰顶 i继续遍历,找到递减结束的位置。
  3. 检查有效性
    • 峰顶 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+🔴🀄️open in new window 🔗open in new window
2865美丽塔 I 数组 单调栈🟠🀄️open in new window 🔗open in new window