当 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:
输入:[9,4,2,10,7,8,8,1,9]
输出:5
解释:(A[1] > A[2] < A[3] > A[4] < A[5])
示例 2:
输入:[4,8,12,16]
输出:2
示例 3:
输入:[100]
输出:1
知识点:
compareTo(Integer anotherInteger) 和 compare(int x, int y) 方法
public int compareTo(Integer anotherInteger) {
return compare(this.value, anotherInteger.value);
}
compareTo 方法内部直接调用 compare 方法。
public static int compare(int x, int y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
如果 x < y 返回 -1
如果 x == y 返回 0
如果 x > y 返回 1
System.out.println(Integer.compare(1, 2)); //-1
System.out.println(Integer.compare(1, 1)); //0
System.out.println(Integer.compare(1, 0)); //1
思路:
如果用 -1, 0, 1 代表比较符的话(分别对应 <、 =、 >),那么我们的目标就是在符号序列中找到一个最长的元素交替子序列 1, -1, 1, -1, …(从 1 或者 -1 开始都可以)。
错误代码:
class Solution {
public int maxTurbulenceSize(int[] A) {
int totalNum = 1;
int max = 1;
for (int i = 1; i < A.length; i++) {
int symbol = Integer.compare(A[i - 1], A[i]);
// if (i == 1 || symbol * Integer.compare(A[i - 2], A[i - 1]) == -1){
totalNum++;
if(i == A.length - 1) max = Math.max(max, totalNum);
}
else {
max = Math.max(max, totalNum);
totalNum = 2;
}
}
return max;
}
}
symbol(符号)之间比较时不要与前面的符号比较,要和后面的比较。因为如果是类似【9,9】时,max是为1的,而【9】也唯一。所以比较特殊。
而且判断符号相乘为1时比较麻烦,判-1会好一点。
正确代码:
class Solution {
public int maxTurbulenceSize(int[] A) {
int anchor = 0;
int max = 1;
for (int i = 1; i < A.length; i++) {
int symbol = Integer.compare(A[i - 1], A[i]);
if (i == A.length - 1 || symbol * Integer.compare(A[i], A[i + 1]) != -1){
if(symbol != 0) max = Math.max(max, i - anchor + 1);
anchor = i;
}
} return max;
}
}