978. 最长湍流子数组
难度中等140收藏分享切换为英文接收动态反馈
当 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:
1 | 输入:[9,4,2,10,7,8,8,1,9] |
示例 2:
1 | 输入:[4,8,12,16] |
示例 3:
1 | 输入:[100] |
提示:
1 <= A.length <= 40000
0 <= A[i] <= 10^9
动态规划
我们可以定义两个子问题,分别对应最后一段上升和下降的波形子数组:
- 子问题 f(k) 为数组 A[0..k) 中,以 A[k-1] 结尾,且最后一段为“上升”的最长波形子数组;
- 子问题 g(k) 为数组 A[0..k) 中,以 A[k-1] 结尾,且最后一段为“下降”的最长波形子数组。
那么我们的子问题递推关系就变得清晰了起来:
- 如果 A[k-1] 和 A[k-2] 之间是“上升”,那么 $f(k) = g(k-1) + 1$,$g(k) = 1$;
- 如果 A[k-1] 和 A[k-2] 之间是“下降”,那么 $f(k) = 1$,$g(k) = f(k-1) + 1$;
- 如果 A[k-1] 和 A[k-2] 之间是“水平”,那么 $f(k) = 1$,$g(k) = 1$。
1 | class Solution { |
滑动窗口
1 | class Solution { |
1 |
|
参考文献
1 | 作者:nettee |