链接:https://leetcode-cn.com/problems/longest-turbulent-subarray/
当 A
的子数组 A[i], A[i+1], ..., A[j]
满足下列条件时,我们称其为湍流子数组:
- 若
i <= k < j
,当k
为奇数时,A[k] > A[k+1]
,且当k
为偶数时,A[k] < A[k+1]
; - 或 若
i <= k < j
,当k
为偶数时,A[k] > A[k+1]
,且当k
为奇数时,A[k] < A[k+1]
。
也就是说,如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是湍流子数组。
返回 A
的最大湍流子数组的长度。
示例 1:
输入:[9,4,2,10,7,8,8,1,9] 输出:5 解释:(A[1] > A[2] < A[3] > A[4] < A[5])
示例 2:
输入:[4,8,12,16] 输出:2
示例 3:
输入:[100] 输出:1
提示:
1 <= A.length <= 40000
0 <= A[i] <= 10^9
思路:如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是湍流子数组。注意相邻要求,我们用dp[i]表示,以nums[i]作为结尾、能够得到的湍流子数组长度,此时如果想要将nums[i+1]加入,那么只需要看nums[i-1]、nums[i]、nums[i+1]是否可以构成湍流子数组:
A. 如果可以,则dp[i + 1] = dp[i] + 1
B. 如果不可以,还需要分情况。 如果nums[i] != num[i+1],那么他们可以构成一个长度为2的湍流子数组;如果nums[i] == num[i+1],那么只能构成长度为1的湍流子数组。
class Solution {
public:
int maxTurbulenceSize(vector<int>& arr) {
int dp[40010], n = arr.size(), i, ans;
if(n < 2) return n;
if(n == 2){
if(arr[0] == arr[1])return 1;
return 2;
}
memset(dp,0,sizeof(dp));
dp[0] = 1;
dp[1] = arr[0] == arr[1] ? 1 : 2;
ans = max(dp[0], dp[1]);
for(i = 2; i < n; ++ i){
if((long long)(arr[i] - arr[i - 1]) * (long long)(arr[i - 1] - arr[i - 2]) < 0){
dp[i] = dp[i - 1] + 1;
}else{
dp[i] = arr[i] == arr[i - 1]? 1 : 2;
}
ans = max(ans, dp[i]);
}
return ans;
}
};