携手创作,共同成长!这是我参与「掘金日新计划 · 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]
示例 1:
输入: arr = [2,1]
输出: false
示例 2:
输入: arr = [3,5,5]
输出: false
示例 3:
输入: arr = [0,3,2,1]
输出: true
提示:
- 1 <= arr.length <=
- 0 <= arr[i] <=
解题思路
根据图示和提示说明,所谓山脉数组:中间存在一个山顶元素,在它左边元素集是递增的,右边元素集是递减的,形似山峰而得名,这一题我们采用比较直接的方式:遍历数组所有元素
- 从左往右开始遍历元素,直到某个元素的下一个元素小于这个元素自身,暂时设置该元素为顶峰;
- 判断所设定的山顶元素是否为数组的首元素,若山顶为数组的首元素,则直接返回 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;
}
运行结果
复杂度分析
- 时间复杂度:
- 空间复杂度:
在掘金(JUEJIN) 一起分享知识, Keep Learning!