链接
https://leetcode-cn.com/problems/longest-mountain-in-array/
耗时
解题:30 min
题解:9 min
题意
我们把数组 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。
0 <= A.length <= 10000
0 <= A[i] <= 10000
思路
找到每个局部极大值(山顶),从山顶向两边扩展,计数这个山顶的山脉长度,取所有山脉长度的最大值即是答案。
一个山顶扩展完后可以直接从这个山脉的最右边再开始找山顶,无需从当前山顶的下一个位置开始找。
时间复杂度: O ( n ) O(n) O(n)
AC代码
class Solution {
public:
int longestMountain(vector<int>& A) {
int n = A.size();
if(n < 3) return 0;
int ans = 0;
for(int i = 1; i < n-1; ++i) {
if(A[i] > A[i-1] && A[i] > A[i+1]) {
int l = i-1;
int r = i+1;
while(l-1 >= 0 && A[l] > A[l-1]) l--;
while(r+1 < n && A[r] > A[r+1]) r++;
ans = max(ans, r-l+1);
i = r;
}
}
return ans;
}
};