941. 有效的山脉数组

85 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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]

image.png

示例

  • 输入: arr = [2,1];输出: false
  • 输入: arr = [3,5,5];输出: false
  • 输入: arr = [0,3,2,1];输出: true

提示

  • 1 <= arr.length <= 100000
  • 0 <= 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()方法找到数组中的最大值
    • 然后联合使用indexOflastIndexOf保证最大值是唯一的,如果不唯一,那么这个数组肯定不是山脉数组
    • 然后判断数组最大值得位置,最大值在数组的第一个和最后一个都不行,都无法称为山脉数组
    • 然后遍历数组最大值的左边,范围是数组的开头到最大值的下标减一,如果这个范围内出现一个arr[i] >= arr[i+1],那么说明左边的肯定不是升序排列的,返回false
    • 最后遍历数组最大值的右边,范围是最大值下标一直到数组末尾,如果这个范围内出现一个arr[i] <= arr[i+1],那么说明右边肯定不是按照降序排列的,返回false
    • 如果上面的条件都满足后,那么足以证明这个数组山脉数组,返回true