算法练习——最长湍流子数组

2021年2月8日LeetCode每日一题为978. 最长湍流子数组,这道题使用逻辑判断将所有情况涵盖即可通过,首先循环给定数组到倒数第二项,每次将当前项与后一项进行比较,需要记录一下上次符号,假定第一次的符号为等号,记为0,小于记为-1,大于记为1。满足上次符号为等号或者是否满足题设要求这个条件,则将符号标记赋值为对应数值,若是相等的情况,代表起始位置应从后一位开始,否则从当前位继续,并且下一位的符号应为这次符号的相对符号。若未满足上述条件,需要记录本次的长度,并判断是相等还是不满足题设,相等的情况需要从后面那个数继续,并且标记符号也要变成对应的值,若是不满足题设则直接将起始位置定为当前位置,不影响后续判断。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution {
public int maxTurbulenceSize(int[] arr) {
if (arr.length == 0) return 0;
int maxAns = 0, begin = 0, last = 0;
for (int i = 0; i < arr.length - 1; i++) {
if (last == 0
|| (arr[i] > arr[i + 1] && last == -1)
|| (arr[i] < arr[i + 1] && last == 1)) {
if (arr[i] > arr[i + 1]) {
last = 1;
} else if (arr[i] < arr[i + 1]) {
last = -1;
} else {
begin = i + 1;
}
} else {
maxAns = Math.max(maxAns, i - begin + 1);
if (arr[i] == arr[i + 1]) {
begin = i + 1;
last = 0;
} else {
begin = i;
}
}
}
return Math.max(maxAns, arr.length - begin);
}
}