【题目】先给出可整合数组的定义:如果一个数组在排好序之后,每相邻两个数差的绝对值都为1,则该数组为可整合数组。给定一个整型数组arr,请返回其中最大可整合 子数组的长度。例如,[5,5,3,2,6,4,3]的最大可整合子数组为[5,3,2,6,4],所以返回5。
public class GetLIL {
// 暴力解法
public static int getLIL1(int[] arr) {
if (arr == null || arr.length == 0) {
return 0;
}
int len = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = i; j < arr.length; j++) {
if (isIntegered(arr, i, j)) {
len = Math.max(len, j - i + 1);
}
}
}
return len;
}
public static boolean isIntegered(int[] arr, int left, int right) {
int[] newArr = Arrays.copyOfRange(arr, left, right + 1);
Arrays.sort(newArr);
for (int i = 1; i < newArr.length; i++) {
if (newArr[i - 1] != newArr[i] - 1) {
return false;
}
}
return true;
}
// 加速解法O(N*N)一个数组中如果没有重复元素,并且如果最大值减去最小值,再加一的结果等于元素个数,那么这个数组就是可整合数组。
public static int getLIL2(int[] arr) {
if (arr == null || arr.length == 0) {
return 0;
}
int max = 0;
int min = 0;
int len = 0;
HashSet<Integer> set = new HashSet<>();
for (int i = 0; i < arr.length; i++) {
max = Integer.MIN_VALUE;
min = Integer.MAX_VALUE;
for (int j = i; j < arr.length; j++) {
if (set.contains(arr[j])) {
break;
}
set.add(arr[j]);
max = Math.max(max, arr[j]);
min = Math.min(min, arr[j]);
if (max - min == j - i) {
len = Math.max(max, j - i + 1);
}
}
set.clear();
}
return len;
}
}