题目描述:
我们把数组 A 中符合下列属性的任意连续子数组 B 称为 “山脉”:
B.length >= 3
- 存在
0 < i < B.length - 1
使得B[0] < B[1] < ... B[i-1] < B[i] > B[i+1] > ... > B[B.length - 1]
(注意:B 可以是 A 的任意子数组,包括整个数组 A。)
给出一个整数数组 A
,返回最长 “山脉” 的长度。
如果不含有 “山脉” 则返回 0
。
示例 1:
输入:[2,1,4,7,3,2,5] 输出:5 解释:最长的 “山脉” 是 [1,4,7,3,2],长度为 5。
示例 2:
输入:[2,2,2] 输出:0 解释:不含 “山脉”
思路:
用两个指针,用一个慢指针用来标记山脉的入口,用一个快指针,遍历后面的数据,如果后面的数据符合山脉的要求,那么快指针就继续遍历,如果快指针遇到的数据不再满足山脉的数学要求,那么首先判断慢指针和快指针之间是否满足一个山脉,如果满足,更新一下最大的山脉长度和快指针和慢指针的位置,再继续遍历
代码:
class Solution {
public:
int longestMountain(vector<int>& A) {
int len=A.size();
if(len<3)
return 0;
int fast=1, slow=0, maxLen=0;
int tag_less=0, tag_more=0;
while(fast<len){
if(tag_less==0 && tag_more==0 && A[fast-1]<A[fast])//处于山脉的前半段,开始山脉
{
fast++;
tag_less=1;
}
else if(tag_less==1 && tag_more==0 && A[fast-1]<A[fast])
fast++;
else if(tag_less==1 && tag_more==0 && A[fast-1]>A[fast])//遇到山峰
{
fast++;
tag_more=1;
}
else if(tag_less==1 && tag_more==1 && A[fast-1]>A[fast])//遇到山脉的后半段
{
fast++;
}
else if(tag_less==1 && tag_more==1 && A[fast-1]<=A[fast])//山脉结束
{
tag_less=0;
tag_more=0;
maxLen=max(maxLen, fast-slow);
slow=fast-1;
}
else{//不符合山脉的要求
tag_less=0;
tag_more=0;
slow=fast;
fast++;
}
}
if(tag_less==1 && tag_more==1)
maxLen=max(maxLen, fast-slow);
return maxLen;
}
};