题目地址:

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,l1,并且有 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[l1]

可以用双指针来做。慢指针 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 rl+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)

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐