链接
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;
}
};
本文针对LeetCode上的最长山脉问题提供了解决方案。介绍了如何通过寻找局部极大值并从该点向两边扩展的方法来求解最长的山脉序列。最终实现的时间复杂度为O(n),并附带了完整的C++代码实现。
2574

被折叠的 条评论
为什么被折叠?



