给定一个整数数组 arr ,返回 arr 的 最大湍流子数组的长度 。
如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是 湍流子数组 。
更正式地来说,当 arr 的子数组 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]。
示例 1:
输入:arr = [9,4,2,10,7,8,8,1,9]
输出:5
解释:arr[1] > arr[2] < arr[3] > arr[4] < arr[5]
示例 2:
输入:arr = [4,8,12,16]
输出:2
示例 3:
输入:arr = [100]
输出:1
提示:
1 <= arr.length <= 4 * 104^44
0 <= arr[i] <= 109^99
分组循环,每组是一个湍流子数组:
cpp
class Solution {
public:
int maxTurbulenceSize(vector<int>& arr) {
int n = arr.size();
// 初始化结果值为1,当整个数组的值都相等时,对应该最小值1
int ans = 1;
int i = 0;
while (i < n - 1) {
int start = i;
++i;
// 如果两个值相等,则必然不是湍流子数组
if (arr[i] == arr[start]) {
continue;
}
while (i < n - 1 && (long long)(arr[i] - arr[i - 1]) * (arr[i + 1] - arr[i]) < 0) {
++i;
}
ans = max(ans, i - start + 1);
}
return ans;
}
};
如果arr的长度为n,则此算法时间复杂度为O(n),空间复杂度为O(1)。