99
1010## 题目大意
1111
12- 给定一个数组 ` arr ` 。当 ` arr ` 的子数组 ` arr[i] ` , ` arr[i + 1] ` , ` ... ` , ` arr[j] ` 满足下列条件时,我们称其为湍流子数组:
12+ ** 描述 ** : 给定一个数组 $ arr$ 。当 $ arr$ 的子数组 $ arr[ i] $,$ arr[ i + 1] $,$ ...$, $ arr[ j] $ 满足下列条件时,我们称其为湍流子数组:
1313
14- - 若 ` i <= k < j` ,当 ` k ` 为奇数时, ` arr[k] > arr[k + 1] ` ,且当 ` k ` 为偶数时,` arr[k] < arr[k + 1] ` ;
15- - 或若 ` i <= k < j` ,当 ` k ` 为偶数时,` arr[k] > arr[k + 1] ` ,且当 ` k ` 为奇数时,` arr[k] < arr[k + 1] ` 。
14+ - 如果 $i \le k < j$ ,当 $k$ 为奇数时, $ arr[ k] > arr[ k + 1] $ ,且当 $k$ 为偶数时,$ arr[ k] < arr[ k + 1] $ ;
15+ - 或如果 $i \le k < j$ ,当 $k$ 为偶数时,$ arr[ k] > arr[ k + 1] $ ,且当 $k$ 为奇数时,$ arr[ k] < arr[ k + 1] $ 。
1616- 也就是说,如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是湍流子数组。
1717
18- 要求:返回给定数组 ` arr ` 的最大湍流子数组的长度。
18+ ** 要求** :返回给定数组 $arr$ 的最大湍流子数组的长度。
19+
20+ ** 说明** :
21+
22+ - $1 \le arr.length \le 4 \times 10^4$。
23+ - $0 \le arr[ i] \le 10^9$。
24+
25+ ** 示例** :
26+
27+ - 示例 1:
28+
29+ ``` python
30+ 输入:arr = [9 ,4 ,2 ,10 ,7 ,8 ,8 ,1 ,9 ]
31+ 输出:5
32+ 解释:arr[1 ] > arr[2 ] < arr[3 ] > arr[4 ] < arr[5 ]
33+ ```
34+
35+ - 示例 2:
36+
37+ ``` python
38+ 输入:arr = [4 ,8 ,12 ,16 ]
39+ 输出:2
40+ ```
1941
2042## 解题思路
2143
22- 湍流子数组实际上像波浪一样,比如 ` arr[i - 2] > arr[i - 1] < arr[i] > arr[i + 1] < arr[i + 2] ` 。所以我们可以使用双指针的做法。具体做法如下:
44+ ### 思路 1:快慢指针
2345
24- - 使用两个指针 ` left ` 、` right ` 。` left ` 指向湍流子数组的左端,` right ` 指向湍流子数组的右端。
25- - 如果 ` arr[right - 1] == arr[right] ` ,则更新 ` left = right ` ,重新开始计算最长湍流子数组大小。
26- - 如果 ` arr[right - 2] < arr[right - 1] < arr[right] ` ,此时为递增数组,则 ` left ` 从 ` right - 1 ` 开始重新计算最长湍流子数组大小。
27- - 如果 ` arr[right - 2] > arr[right - 1] > arr[right] ` ,此时为递减数组,则 ` left ` 从 ` right - 1 ` 开始重新计算最长湍流子数组大小。
28- - 其他情况(即 ` arr[right - 2] < arr[right - 1] > arr[right] ` 或 ` arr[right - 2] > arr[right - 1] < arr[right] ` )时,不用更新 ` left ` 值。
29- - 更新最大湍流子数组的长度,并向右移动 ` right ` 。直到 ` right >= len(arr) ` 时,返回答案 ` ans ` 。
46+ 湍流子数组实际上像波浪一样,比如 $arr[ i - 2] > arr[ i - 1] < arr[ i] > arr[ i + 1] < arr[ i + 2] $。所以我们可以使用双指针的做法。具体做法如下:
3047
31- ## 代码
48+ - 使用两个指针 $left$、$right$。$left$ 指向湍流子数组的左端,$right$ 指向湍流子数组的右端。
49+ - 如果 $arr[ right - 1] == arr[ right] $,则更新 ` left = right ` ,重新开始计算最长湍流子数组大小。
50+ - 如果 $arr[ right - 2] < arr[ right - 1] < arr[ right] $,此时为递增数组,则 $left$ 从 $right - 1$ 开始重新计算最长湍流子数组大小。
51+ - 如果 $arr[ right - 2] > arr[ right - 1] > arr[ right] $,此时为递减数组,则 $left$ 从 $right - 1$ 开始重新计算最长湍流子数组大小。
52+ - 其他情况(即 $arr[ right - 2] < arr[ right - 1] > arr[ right] $ 或 $arr[ right - 2] > arr[ right - 1] < arr[ right] $)时,不用更新 $left$值。
53+ - 更新最大湍流子数组的长度,并向右移动 $right$。直到 $right \ge len(arr)$ 时,返回答案 $ans$。
54+
55+ ### 思路 1:代码
3256
3357``` python
3458class Solution :
@@ -49,3 +73,8 @@ class Solution:
4973 return ans
5074```
5175
76+ ### 思路 1:复杂度分析
77+
78+ - ** 时间复杂度** :$O(n)$,其中 $n$ 为数组 $arr$ 中的元素数量。
79+ - ** 空间复杂度** :$O(1)$。
80+
0 commit comments