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

    以上。

  • 相关阅读:
    Spring3:AOP
    Spring2:bean的使用
    Spring1:Spring简介、环境搭建、源码下载及导入MyEclipse
    Vue.js——60分钟组件快速入门(上篇)
    vue父子组件嵌套的时候遇到
    Vue.js——60分钟快速入门
    [Vue warn]: Cannot find element: #app
    关于RabbitMQ以及RabbitMQ和Spring的整合
    spring集成多个rabbitMQ
    RabbitMQ-从基础到实战(5)— 消息的交换(下)
  • 原文地址:https://www.cnblogs.com/Esquecer/p/10311917.html
Copyright © 2011-2022 走看看