leecode 978. Longest Turbulent Subarray(最长连续波动序列,DP or 滚动数组)

Posted esquecer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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,而是等于上个状态取到的最长的。

以上。


以上是关于leecode 978. Longest Turbulent Subarray(最长连续波动序列,DP or 滚动数组)的主要内容,如果未能解决你的问题,请参考以下文章

LeeCode(5. Longest Palindromic Substring)

LeetCode 978. Longest Turbulent Subarray

978. Longest Turbulent Subarray

978. Longest Turbulent Subarray

Leetcode 978. Longest Turbulent Subarray

Leecode 1218. 最长定差子序列——Leecode每日一题系列