LeetCode978-最长湍流子数组

题目链接

英文链接:https://leetcode.com/problems/longest-turbulent-subarray/

中文链接: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:

1
2
3
输入:[9,4,2,10,7,8,8,1,9]
输出:5
解释:(A[1] > A[2] < A[3] > A[4] < A[5])

示例 2:

1
2
输入:[4,8,12,16]
输出:2

示例 3:

1
2
输入:[100]
输出:1

提示:

  1. 1 <= A.length <= 40000
  2. 0 <= A[i] <= 10^9

题目详解

  • LeetCode376-摆动序列 求的是摆动的最长子序列,而本题是求摆动的最长子数组。子序列不要求连续,子数组要求连续。解题思路是一致的。
  • 运用两个变量 updown 来表示到此处是上升或下降。
  • 如果 A[i] > A[i - 1],则 up = down + 1,因为要保持连续,还需要使 down = 1
  • 如果 A[i] < A[i - 1],则 down = up + 1,因为要保持连续,还需要使 up= 1
  • 如果 A[i] == A[i - 1],则 down = 1up= 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class LeetCode_00978 {

public int maxTurbulenceSize(int[] A) {
int res = 1;
int up = 1, down = 1;
for (int i = 1; i < A.length; ++i) {
if (A[i] > A[i - 1]) {
up = down + 1;
down = 1;
res = Math.max(res, up);
} else if (A[i] < A[i - 1]) {
down = up + 1;
up = 1;
res = Math.max(res, down);
} else {
up = 1;
down = 1;
}
}
return res;
}
}