最长湍流子数组
如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是湍流子数组。
由于符号的反转有两种情况,所以加一个维度就好。
- 状态
d p [ i ] [ 0 ] dp[i][0] dp[i][0]表示以第i位结尾的子数组且最后一个符号为 > > >的长度;
d p [ i ] [ 1 ] dp[i][1] dp[i][1]表示以第i位结尾的子数组且最后一个符号为 < < <的长度; - 转移方程:如程序所示。
注:在子数组的问题,经常以第i位结尾的数组为子集,而子序列往往以前缀 [ 0 , i ] [0,i] [0,i]为子集。
class Solution {
public:
int maxTurbulenceSize(vector<int>& a) {
int n = a.size(),dp[40010][2];
dp[0][0] = dp[0][1] = 1;
for(int i=1;i<n;i++){
if(a[i]>a[i-1]){
dp[i][1] = dp[i-1][0]+1;
dp[i][0] = 1;
}else if(a[i]<a[i-1]){
dp[i][0] = dp[i-1][1]+1;
dp[i][1] = 1;
}else{
dp[i][0] = dp[i][1] = 1;
}
}
int ans = 1;
for(int i=0;i<n;i++){
ans = max(ans,max(dp[i][0],dp[i][1]));
}
return ans;
}
};