原题链接在这里:
题目:
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: 5Explanation: (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
题解:
Set some small examples like [1, 3, 2], [2,2] and find routine.
It matters the last 3 componenets. If it is l<m>r or l>m<r relationship, then length+1. Otherwise, reset to 2 or 1.
Let dp[i] denotes up to A[i-1], the longest turbulent length.
If A[i-3]<A[i-2]>A[i-1] or A[i-3]>A[i-2]<A[i-1], dp[i] = dp[i-1] + 1.
Maintain the maximum to res.
Time Complexity: O(n). n = A.length.
Space: O(n).
AC Java:
1 class Solution { 2 public int maxTurbulenceSize(int[] A) { 3 if(A == null){ 4 return 0; 5 } 6 7 if(A.length < 2){ 8 return A.length; 9 }10 11 int len = A.length;12 int [] dp = new int[len+1];13 dp[1] = 1;14 dp[2] = A[0] == A[1] ? 1 : 2;15 16 int res = dp[2];17 for(int i = 3; i<=len; i++){18 if(A[i-2] A[i-3] && A[i-2]>A[i-1]){19 dp[i] = dp[i-1] + 1;20 res = Math.max(res, dp[i]);21 }else if(A[i-1] == A[i-2]){22 dp[i] = 1;23 }else{24 dp[i] = 2;25 }26 }27 28 return res;29 }30 }
It only cares about dp[i-1]. Thus it could reduce dimension.
Time Complexity: O(n).
Space: O(1).
AC Java:
1 class Solution { 2 public int maxTurbulenceSize(int[] A) { 3 if(A == null){ 4 return 0; 5 } 6 7 if(A.length < 2){ 8 return A.length; 9 }10 11 int len = A.length;12 int dp = A[0] == A[1] ? 1 : 2;13 int res = dp;14 15 for(int i = 3; i<=len; i++){16 if(A[i-2] A[i-3] && A[i-2]>A[i-1]){17 dp = dp + 1;18 res = Math.max(res, dp);19 }else if(A[i-1] == A[i-2]){20 dp = 1;21 }else{22 dp = 2;23 }24 }25 26 return res;27 }28 }
类似.