【Leetcode】845. Longest Mountain in Array
题目地址:https://leetcode.com/problems/longest-mountain-in-array/给定一个数组AAA,求其最长的子数组BBB,满足以下条件:1、BBB的长度lll大于等于333;2、存在一个下标iii,i≠0,l−1i\ne 0,l-1i=0,l−1,并且有B[0]<B[1]<...<B[i]>B[i+1]>B[i+2]&g
题目地址:
https://leetcode.com/problems/longest-mountain-in-array/
给定一个数组 A A A,求其最长的子数组 B B B,满足以下条件:
1、 B B B的长度 l l l大于等于 3 3 3;
2、存在一个下标 i i i, i ≠ 0 , l − 1 i\ne 0,l-1 i=0,l−1,并且有 B [ 0 ] < B [ 1 ] < . . . < B [ i ] > B [ i + 1 ] > B [ i + 2 ] > . . . B [ l − 1 ] B[0]<B[1]<...<B[i]>B[i+1]>B[i+2]>...B[l-1] B[0]<B[1]<...<B[i]>B[i+1]>B[i+2]>...B[l−1]。
可以用双指针来做。慢指针 l l l从 0 0 0出发,先略过相同的数字,然后停在一个位置 i i i使得 A [ i ] ≠ A [ i + 1 ] A[i]\ne A[i+1] A[i]=A[i+1],接着让快指针 r r r从 i + 1 i+1 i+1出发,先“爬山”,再“下山”,下山到了山底的时候,就可以停下来了,这是就可以更新找到的山的长度(即 r − l + 1 r-l+1 r−l+1)。但需要注意的是,要求的子数组必须是既有上山也有下山的过程的,光有一个不行,所以还要开两个boolean变量,记录是否上山和下山过。遍历完这个山后,将 l l l移到 r r r的位置,继续上述过程,直到整个数组遍历完毕。代码如下:
class Solution {
public:
int longestMountain(vector<int> &a) {
int l = 0, r = 0, n = a.size();
int res = 0;
while (l < n) {
while (l + 1 < n && a[l] == a[l + 1]) l++;
if (l == n - 1) break;
r = l + 1;
bool up = false, down = false;
while (r < n && a[r - 1] < a[r]) {
r++;
up = true;
}
while (r < n && a[r - 1] > a[r]) {
r++;
down = true;
}
if (up && down) res = max(res, r - l);
l = r = r - 1;
}
return res;
}
};
时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)。
更多推荐


所有评论(0)