方法一:暴力解法
思路:遍历每个位置,用双指针向两边延伸找到最长山脉,时间复杂度 O ( n 2 ) O(n^2) O(n2)
class Solution {
public:
int longestMountain(vector<int>& A) {
int len=A.size(),ans=0;
for(int i=0;i<len;++i){
int left=i,right=i;
while(0<left&&A[left-1]<A[left]) --left;
while(right<len-1&&A[right]>A[right+1]) ++right;
if(left==i||right==i) continue;
ans=max(ans,right-left+1);
}
return ans<3?0:ans;
}
};
方法二:跳跃式
思路:遍历每个位置,用1个指针right
向右延伸,若为山峰则令left=right
,类似KMP算法。时间复杂度
O
(
n
)
O(n)
O(n)
class Solution {
public:
int longestMountain(vector<int>& A) {
if (A.size() < 3) return 0;
int len = A.size(), ans = 0, left = 0;
while (left <= len - 2) {
int right = left;//right尝试延伸山脉
if (A[right] < A[right + 1]) {//严格上升,否则left++进入下一轮
while (right < len - 1 && A[right] < A[right + 1]) ++right;
if (right<len - 1 && A[right]>A[right + 1]) {//到达山峰严格下降
while (right<len - 1 && A[right]>A[right + 1]) ++right;
ans = max(ans, right - left + 1);
left = right;//找下个山峰,left的跳跃性,类似kmp
}
else {//无严格下降则无山峰,开始下轮
left = right + 1;
continue;
}
}
else ++left;
}
return ans;
}
};