LeetCode 978. 最长湍流子数组 (LIS的变种(多一个维度))

最长湍流子数组
如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是湍流子数组。
由于符号的反转有两种情况,所以加一个维度就好。

  • 状态
    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;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_44846324/article/details/109007128