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