978.最长湍流子数组

问题描述

978.最长湍流子数组_第1张图片
978.最长湍流子数组_第2张图片

思路

求最值问题,不用输出具体的结果,只需要输出长度,那么就可以使用动态规划,确定了方法,就可以根据方法的模板来写。
首先确定状态,这里的dp数组为2行n列
dp[0][j]表示以第j个数字为结尾的,且当前为升序列,也就是第j个数大于第j-1个数。
dp[1][j]表示以第j个数字为结尾的,且当前为降序列,也就是第j个数小于第j-1个数。
第一行代表状态为升,第二行代表状态为减
那么就有了状态转移方程:
如果当前状态为升,那么dp[0][j]=dp[1][j-1]+1;
如果当前状态为降,那么dp[1][j]=dp[0][j-1]+1;
最终结果就是求dp中的最大值,这就遍历了所有的情况

代码

class Solution {
     
public:
    int maxTurbulenceSize(vector<int>& arr) {
     
        int n=arr.size(),res=0;
        if(n==1) return 1;
        vector <vector <int> >dp(2,vector <int> (n,1));
        for(int j=1;j<n;j++) {
     
            if(arr[j]<arr[j-1]) {
     
                dp[1][j]=dp[0][j-1]+1;
            }
            else if(arr[j]>arr[j-1]) {
     
                dp[0][j]=dp[1][j-1]+1;
            }
            res=max(res,max(dp[0][j],dp[1][j]));
        }
        return res;
    }
};

你可能感兴趣的:(leetcode,折磨之王,动态规划,动态规划,leetcode)