zoukankan      html  css  js  c++  java
  • leecode 978. Longest Turbulent Subarray(最长连续波动序列,DP or 滚动数组)

    传送门:点我

    978. Longest Turbulent Subarray

    A subarray A[i], A[i+1], ..., A[j] of A is said to be turbulent if and only if:

    • For i <= k < jA[k] > A[k+1] when k is odd, and A[k] < A[k+1] when k is even;
    • OR, for i <= k < jA[k] > A[k+1] when k is even, and A[k] < A[k+1] when k is odd.

    That is, the subarray is turbulent if the comparison sign flips between each adjacent pair of elements in the subarray.

    Return the length of a maximum size turbulent subarray of A.

    Example 1:

    Input: [9,4,2,10,7,8,8,1,9]
    Output: 5
    Explanation: (A[1] > A[2] < A[3] > A[4] < A[5])
    

    Example 2:

    Input: [4,8,12,16]
    Output: 2
    

    Example 3:

    Input: [100]
    Output: 1

    Note:

    1. 1 <= A.length <= 40000
    2. 0 <= A[i] <= 10^9

    题意:求最长的连续波动子序列,注意是连续。

    思路:DP滚动一下就行了。

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

    那么,换个思路,如果求的是最长的波动序列呢(可不连续)?

    改下DP就行了,看下面代码:

    if(a[i]>a[i-1]){
            dp[i][0]=max(dp[i-1][0],dp[i-1][1]+1);
            dp[i][1]=dp[i-1][1];
    }
    else if(a[i]<a[i-1]){
            dp[i][1]=max(dp[i-1][1],dp[i-1][0]+1);
            dp[i][0]=dp[i-1][0];
    }
    else if(a[i]==a[i-1]){
            dp[i][0]=dp[i-1][0];
            dp[i][1]=dp[i-1][1];
    }
    return max(dp[n][0],dp[n][1]);

    不是很难理解,递推下来不满足的不是等于1,而是等于上个状态取到的最长的。

    以上。

  • 相关阅读:
    vue去除#号tomcat配置
    vscode配置
    git忽略想要提交的文件
    vue-cli配置移动端自适应
    远程调试工具 -- weinre
    将博客搬至CSDN
    错误:this dependency was not found:'element-ui/lib/theme-chalk/index.css'。。。。。。。
    win上java1.7和1.8版本修改环境变量无效.md
    mysql 事务
    mysql 函数
  • 原文地址:https://www.cnblogs.com/Esquecer/p/10311917.html
Copyright © 2011-2022 走看看