978. 最长湍流子数组
给定一个整数数组 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:
1 | 输入:arr = [9,4,2,10,7,8,8,1,9] |
示例 2:
1 | 输入:arr = [4,8,12,16] |
示例 3:
1 | 输入:arr = [100] |
提示:
1 <= arr.length <= 4 * 104
0 <= arr[i] <= 109
解题思路:
湍流子数组的形成条件是两种相反的状态,所以需要两个dp数组来分别表示两种状态。
- 确定dp数组及其下标含义:
- 定义
up[i]
表示以位置i结尾,并且arr[i-1] < arr[i]
的最长湍流子数组的长度 - 定义
down[i]
来表示以位置i结尾,,并且arr[i-1] >arr[i]
的最长湍流子数组的长度
- 定义
- 确定递推方程:
- 当
arr[i - 1] < arr[i]
,根据下降湍流子数组的长度更新上升数组,up[i] = down[i -1] + 1
,并记录最大值 - 当
arr[i - 1] > arr[i]
,根据上升湍流子数组的长度更新上升数组,down[i] = up[i -1] + 1
,并记录最大值
- 当
- dp数组如何初始化:
- 因为每个数字本身就是一个最小的湍流子数组,所以
up[i]
和down[i]
初始化都为1
- 因为每个数字本身就是一个最小的湍流子数组,所以
代码如下:
1 | public int maxTurbulenceSize(int[] arr) { |
- 时间复杂度:O(N),只需要遍历一次数组。
- 空间复杂度:O(N),使用到两个额外数组。