我们把数组 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
解释:不含 “山脉”。
思路:双指针,用两个指针l, r指向山脉的起点和终点,遍历一遍数组,不断更新l,r的值,如果上一个山脉终点为r,则下一次遍历的起点为r,如果r==l,下一次起点应+1
实现
class Solution {
public:
int longestMountain(vector<int>& A) {
int n = A.size(), ans=0, l=0, r=0;
while (l<n) //l,r分别记录山峰的起点和终点
{
if (l<n-1&&A[l]<A[l+1]) //山峰起点
{
r = l;
while (r<n-1&&A[r]<A[r+1]) r++;
if (r<n-1&&A[r]>A[r+1]) //此时r为峰点
{
while (r<n-1&&A[r]>A[r+1]) r++; //顺着峰点下降,找到终点
ans = max(ans, r-l+1); //更新最长山脉长度
}
}
l = max(l+1,r); //更新下一个山脉的起点
}
return ans;
}
};
链接:https://leetcode-cn.com/problems/longest-mountain-in-array