每日力扣-动态规划-最长湍流子数组

107 阅读1分钟

当 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])

解题思路:因为题目比较傻逼,所以建立2个dp输出最大的。只要反转了就dp++

class Solution {
public:
    int maxTurbulenceSize(vector<int>& arr) {
        int n = arr.size();
        if(n <= 0) return 0;
        vector<int> dp1(n,1);
        vector<int> dp2(n,1);
        for(int i = 1 ; i < n ; i ++)
        {
            if(i % 2 ==0)
            {
                if(arr[i-1] > arr[i])
                {
                    dp1[i] = max(dp1[i-1] + 1, dp1[i]);
                }
                if(arr[i-1] < arr[i])
                {
                    dp2[i] = max(dp2[i-1] + 1, dp2[i]);
                }
            }
            else
            {
                if(arr[i-1] < arr[i])
                {
                    dp1[i] = max(dp1[i-1] + 1, dp1[i]);
                }
                if(arr[i-1] > arr[i])
                {
                    dp2[i] = max(dp2[i-1] + 1, dp2[i]);
                }
            }
        }
        int dp11 = *max_element(dp1.begin(), dp1.end());
        int dp22 = *max_element(dp2.begin(), dp2.end());
        return max(dp11,dp22);
    }
};