夯实算法-22.有效的山脉数组

146 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第32天,点击查看活动详情

题目:LeetCode

给定一个整数数组 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]   20210729103604.png

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 1 <= arr.length <= 10410^4
  • 0 <= arr[i] <= 10410^4

解题思路

根据图示和提示说明,所谓山脉数组:中间存在一个山顶元素,在它左边元素集是递增的,右边元素集是递减的,形似山峰而得名,这一题我们采用比较直接的方式:遍历数组所有元素

  • 从左往右开始遍历元素,直到某个元素的下一个元素小于这个元素自身,暂时设置该元素为顶峰;
  • 判断所设定的山顶元素是否为数组的首元素,若山顶为数组的首元素,则直接返回 false;
  • 上面不满足,则继续遍历下一个元素,直到数组末尾,当然若直到末元素还依然递增,也终止循环,并返回 false;
  • 从设定的山峰元素起(非数组首末元素),往下一个元素遍历,若下一个元素小于该山峰元素则返回 true,即:该数组是一个山脉数组。

代码实现

public boolean validMountainArray(int[] A) {
    int length = A.length;  // 数组长度
    boolean result = false;  // 记录结果
    if(length < 3) { // 元素少于3,必定组不成山脉数组
        return result;
    }

    int maxVal = A[0];   // 先设定最大值(山峰元素)
    int i = 1;
    while(i < length && A[i] > maxVal){ 
        maxVal = A[i++];    // 动态更新山峰元素
    }
    
    if(i == length || i ==1){  // 一个元素比返回 false
        return result;
    }
    
    while(i < length && A[i] < maxVal){
        maxVal = A[i++];
    }

    if(i == length){
        result = true;
    }
    return result;
}

运行结果

T22.png

复杂度分析

  • 时间复杂度:O(n)O(n)
  • 空间复杂度:O(n)O(n)

掘金(JUEJIN)  一起分享知识, Keep Learning!