C ++中最长的湍流子数组
考虑A的子数组A[i],A[i+1],...,A[j]在满足以下条件时被称为湍流-
当i<=k<j且当k为奇数时A[k]>A[k+1],而当k为偶数时A[k]<A[k+1];
否则,对于i<=k<j,当k为偶数时,A[k]>A[k+1],而当k为奇数时,A[k]<A[k+1]。
因此,如果比较符号在子阵列中的每个相邻元素对之间翻转,则子阵列将是湍流的。现在找到最大大小为A的湍流子数组的长度。因此,如果输入为[9,4,2,10,7,8,8,1,9],则输出为5。这是因为A[1]>A[2]<A[3]>A[4]<A[5]
为了解决这个问题,我们将遵循以下步骤-
n:=数组A的大小
prevBig:=1,prevSmall:=1,currBig:=1,currSmall:=1和ret:=1
当我在1到n–1的范围内时
如果A[i]>A[i–1],则currBig:=1+prevSmall
如果A[i]<A[i–1],则currSmall:=1+prevBig
ret:=ret,currBig和currSmall的最大值
prevSmall:=currSmall,prevBig:=currBig,currSmall:=1,currBig:=1
返回ret
让我们看下面的实现以更好地理解-
示例
#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int maxTurbulenceSize(vector<int>& A) {
      int n = A.size();
      int prevBig = 1;
      int prevSmall = 1;
      int currBig = 1;
      int currSmall = 1;
      int ret = 1;
      for(int i = 1; i < n; i++){
         if(A[i] > A[i - 1]){
            currBig = 1 + prevSmall;
         }
         if(A[i] < A[i - 1]){
            currSmall = 1 + prevBig;
         }
         ret = max({ret, currBig, currSmall});
         prevSmall = currSmall;
         prevBig = currBig;
         currSmall = 1;
         currBig = 1;
      }
      return ret;
   }  
};
main(){
   vector<int> v1 = {9,4,2,10,7,8,8,1,9};
   Solution ob;
   cout << (ob.maxTurbulenceSize(v1));
}输入值
[9,4,2,10,7,8,8,1,9]
输出结果
5