题目表述
把符合下列属性的数组 arr 称为 山脉数组 :
- arr.length >= 3
- 存在下标 i(0 < i < arr.length – 1),满足
- arr[0] < arr[1] < … < arr[i – 1] < arr[i]
- arr[i] > arr[i + 1] > … > arr[arr.length – 1]
给出一个整数数组 arr,返回最长山脉子数组的长度。如果不存在山脉子数组,返回 0 。
进阶:
- 你可以仅用一趟扫描解决此问题吗?
- 你可以用 O(1) 空间解决此问题吗?
双指针
1、初始化一个快指针fast和慢指针slow。
2、利用fast指针寻找递增字串,如果递增字串长度为0,则不可能为山脉,令slow = fast,接着从fast在找递增字串。
3、找到山脉上升部分后再接着从fast寻找下降山脉,设置变量down,记录下降山脉的个数,如果down==0,做无下降部分,也不能成为山脉。
4、记录山脉长度,fast – slow,寻找fast – slow过程中的最大值即可
class Solution {
public int longestMountain(int[] arr) {
int slow = 0;
int fast = 1;
int res = 0;
while(fast < arr.length){
while(fast < arr.length && arr[fast] > arr[fast - 1]){
fast++;
}
if(fast == slow + 1){
slow = fast;
fast++;
continue;
}
int down = 0;
while(fast < arr.length && arr[fast] < arr[fast - 1]){
fast++;
down++;
}
if(down != 0)
res = Math.max(fast - slow,res);
slow = fast - 1;
}
return res;
}
}
原创文章,作者:bd101bd101,如若转载,请注明出处:https://blog.ytso.com/245238.html