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,而是等于上个状态取到的最长的。

    以上。

  • 相关阅读:
    python_way day16 DOM
    python_way day15 HTML-DAY2、 回顾HTML-CSS 标签(css强制生效),JS(数据类型,时间处理,作用域)
    预习 jQuary
    python_way day14 CSS,莫泰对话框
    python_way day14 HTML
    php 连接mysql的问题
    python_way day13 paramiko
    List源码学习之LinkedList
    List源码学习之ArrayList
    Jasper之table报表
  • 原文地址:https://www.cnblogs.com/Esquecer/p/10311917.html
Copyright © 2011-2022 走看看