- 数组中的最长山脉
我们把数组 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。
思路:由题意可得,需要找到一个满足先单增后单减的最长数段,输出最大段数即可,可以先从i=1出发,判断是否满足最短山脉,即A[i]>A[i-1]&&A[i]>A[i+1];在用左右指针标记i-1,i+1,要依次满足从i-1向前是单减的,i+1往后是单增的,不满足的话就跳出
代码:
class Solution {
public:
int longestMountain(vector<int>& A) {
int n=A.size();
int res=0;
int count=0;//记录每次满足的山脉值
if(n<3)
{
return 0;
}
for(int i=1;i<n-1;i++)
{
if(A[i-1]<A[i]&&A[i+1]<A[i])
{
count=1;
int l=i-1;//l表示其左边
int r=i+1;//r表示其右边
//依次向左相右遍历,
while(l>=0){
if(A[l]<A[l+1]){
l--;//相对于中间位置满足是单减的条件左移
count++;
}
else{
break;
}
}
while(r<n){
if(A[r-1]>A[r]){//相对于中间位置满足单减的条件 右移
count++;
r=r+1;
}
else{
break;
}
}
res=max(res,count);
}
}
return res;
}
};