题目描述
当一个子数组满足下面条件之一时,我们称它为湍流子数组:
- 对于索引
i,当i是奇数:arr[i] > arr[i-1];当i是偶数:arr[i] < arr[i-1]或者 - 对于索引
i,当i是奇数:arr[i] < arr[i-1];当i是偶数:arr[i] > arr[i-1]
简单一句话:相邻元素大小交替,像波浪一样起伏,不能连续上升,也不能连续下降 。 给定数组 arr,返回最长湍流子数组的长度。
解法

DP 数组定义
fx[i]:以arr[i]结尾,最后一步是 arr i < arr i-1(下降) 的湍流子数组最大长度gx[i]:以arr[i]结尾,最后一步是 arr i > arr i-1(上升) 的湍流子数组最大长度
湍流的特点:上升后面必须接下降,下降后面必须接上升,交替出现。

状态转移
arr[i] > arr[i-1](当前上升)- 当前上升,上一步必须是下降才能构成湍流
gx[i] = fx[i-1] + 1fx[i] = 1(不能以下降结尾,重置为 1,代表只有自己)
arr[i] < arr[i-1](当前下降)- 当前下降,上一步必须是上升才能构成湍流
fx[i] = gx[i-1] + 1gx[i] = 1
arr[i] == arr[i-1](相等,湍流断裂)- 上升、下降都无法延续,
fx[i] = 1,gx[i] =1,子数组只能包含自身
- 上升、下降都无法延续,
cpp
class Solution {
public:
int maxTurbulenceSize(vector<int>& arr) {
int n=arr.size();
vector<int>fx(n,0);
vector<int>gx(n,0);
if(n==1)return 1;
if(n==2&&arr[0]!=arr[1])return 2;
if(n==2&&arr[0]==arr[1])return 1;
fx[0]=1;fx[1]=arr[0]>arr[1]?2:1;
gx[0]=1;gx[1]=arr[0]<arr[1]?2:1;
int ret=1;
for(int i=2;i<n;i++)
{
if(arr[i]>arr[i-1])
{
fx[i]=1;
gx[i]=fx[i-1]+1;
}
else if(arr[i]<arr[i-1])
{
gx[i]=1;
fx[i]=gx[i-1]+1;
}
else{
gx[i]=fx[i]=1;
}
int maxsize=max(fx[i],gx[i]);
ret=ret>maxsize?ret:maxsize;
}
return ret;
}
};