C ++中数组中的最长山峰

如果以下属性成立,则考虑(A的)任何(连续)子数组B称为山峰-

  • B的大小> = 3

  • 存在一些0 <i <B.length-1,使得B [0] <B [1] <... B [i-1] <B [i]> B [i + 1]> ...> B [B.length-1]

假设我们有一个整数数组A;我们必须找到最长的山的长度。如果没有山峰,我们必须返回0。因此,如果输入类似于[2,1,4,7,3,2,5],则结果将为5。因此最大的山峰将为[1,4,7,3,2],其长度为5,

为了解决这个问题,我们将遵循以下步骤-

  • ret:= 0,n:=数组a的大小

  • i:= 0至n – 1,将i增加j + 1

    • down:= true并将j增加1

    • up:= true并将j增加1

    • j:=我

    • 下:=假,上:=假

    • 而j + 1 <n和a [j + 1]> a [j]

    • 而up为true且j +1 <n和a [j +1]> a [j]

    • 如果上下都正确,则设置ret:= j – i + 1的最大值,然后将j减1

    • 返回ret。

    让我们看下面的实现以更好地理解-

    示例

    #include <bits/stdc++.h>
    using namespace std;
    class Solution {
    public:
       int longestMountain(vector<int>& a) {
          int ret = 0;
          int n = a.size();
          int j;
          for(int i = 0; i < n; i = j + 1){
             j = i;
             bool down = false;
             bool up = false;
             while(j + 1 < n && a[j + 1] > a[j]) {
                up = true;
                j++;
             }
             while(up && j + 1 < n && a[j + 1] < a[j]){
                down = true;
                j++;
             }
             if(up && down){
                ret = max(j - i + 1, ret);
                j--;
             }
          }
          return ret;
       }
    };
    main(){
       vector<int> v = {2,1,4,7,3,2,5};
       Solution ob;
       cout << (ob.longestMountain(v));
    }

    输入值

    [2,1,4,7,3,2,5]

    输出结果

    5