开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情
题目 leetcode.cn/
- 给定一个整数数组
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]
示例
输入: arr = [2,1];输出: false输入: arr = [3,5,5];输出: false输入: arr = [0,3,2,1];输出: true
提示
1 <= arr.length <= 1000000 <= arr[i] <= 100000
代码
function validMountainArray(arr: number[]): boolean {
let max = Math.max(...arr);
if(arr.indexOf(max) !== arr.lastIndexOf(max)){
return false;
}
if(arr.indexOf(max) === 0 || arr.indexOf(max) === arr.length - 1){
return false
}
let index = arr.indexOf(max);
for(let i = 0; i < index; i++){
if(arr[i] >= arr[i+1]){
return false
}
}
for(let i = index + 1; i < arr.length - 1; i++){
if(arr[i] <= arr[i+1]){
return false
}
}
return true;
};
思路
- 山脉数组的定义其实是一个倒的
V子型,山顶就是数组中的最大值,有且只能存在一个,在最大值的左边,一定是升序的,在最大值得右边,一定是降序的,满足这些条件,才能被称为山脉数组- 首先用
Math.max()方法找到数组中的最大值 - 然后联合使用
indexOf和lastIndexOf保证最大值是唯一的,如果不唯一,那么这个数组肯定不是山脉数组 - 然后判断数组最大值得位置,最大值在数组的第一个和最后一个都不行,都无法称为
山脉数组 - 然后遍历数组最大值的左边,范围是数组的开头到最大值的下标减一,如果这个范围内出现一个
arr[i] >= arr[i+1],那么说明左边的肯定不是升序排列的,返回false - 最后遍历数组最大值的右边,范围是最大值下标一直到数组末尾,如果这个范围内出现一个
arr[i] <= arr[i+1],那么说明右边肯定不是按照降序排列的,返回false - 如果上面的条件都满足后,那么足以证明这个数组山脉数组,返回
true
- 首先用