# 有效的山脉数组(941)

# 题目

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

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

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

# 示例

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

输入:[3,5,5] 输出:false

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

# 提示

0 <= A.length <= 10000

0 <= A[i] <= 10000

# 算法

# 先上山,后下山

先排除A.length小于3、数组全部递增(即A[A.length-2]<=A[A.length-1])、数组全部递减(即A[0]>=A[1])的情况

使用flag设置一个是否上山的标记(true为上山),遍历数组,当上山时出现A[i]>A[i+1],则改变flag表示下山

在上山的过程中出现A[i]===A[i+1]、下山的过程中出现A[i]<=A[i+1]则说明不是山脉数组,直接返回false

export const vaildMountainArray = (A) => {
	if (A.length < 3 || A[0] >= A[1] || A[A.length - 2] <= A[A.length - 1]) return false;
	let flag = true;
	for (let i = 0; i < A.length - 1; i++) {
		if (flag) {
      if(A[])
			if (A[i] >= A[i + 1]) {
        flag = false;
        // 从第i个元素开始下山(i是山顶),因为下一轮i++,为了不跳过第i个元素,所以要先i--
				i--;
			}
		} else {
			if (A[i] <= A[i + 1]) {
				return false;
			}
		}
	}
	return true;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 双指针

先排除A.length<3的情况

左指针l指向数组头部,如果下一个位置大于当前位置,说明上山l++;否则跳出循环保存l的位置

右指针r指向数组尾部,如果上一个位置大于当前位置,说明下山r--;否则跳出循环保存r的位置

比较左右指针位置,如果相同且左指针没有指向数组尾部(数组不是递增)且右指针没有指向数组头部(数组不是递减),则数组是山脉数组;否则返回false

export const vaildMountainArray = (A) => {
	if (A.length < 3) return false;
	let l = 0,
		r = A.length - 1;
	while (l < A.length) {
		if (A[l] < A[l + 1]) {
			l++;
		} else {
			break;
		}
	}
	while (r >= 0) {
		if (A[r] < A[r - 1]) {
			r--;
		} else {
			break;
		}
	}
	if (l === r && l !== A.length - 1 && r !== 0) {
		return true;
	} else {
		return false;
	}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24