# 有效的山脉数组(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
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24