传送门:点我
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 < j
,A[k] > A[k+1]
whenk
is odd, andA[k] < A[k+1]
whenk
is even; - OR, for
i <= k < j
,A[k] > A[k+1]
whenk
is even, andA[k] < A[k+1]
whenk
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 <= A.length <= 40000
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,而是等于上个状态取到的最长的。
以上。