题目:
先给出可整合数组的定义。如果一个数组在排序后,每相邻的两个数差的绝对值都为1,则该数组为可整合数组。例如,[5,3,4,6,2]排序之后为[2,3,4,5,6],符合每相邻的两个数差的绝对值为1,所以这个数组为可整合数组。
给定一个整形数组arr,请返回其中最大的可整合数组的长度。例如,[5,5,3,2,6,4,3]的最大可整合数组为[5,3,2,6,4],所以返回5.
思路:
最大整合数组有一个特点,数组的长度 = 最大值-最小值+1。除此之外还需要注意去重的问题,此处可以使用Set这一数据结构。
代码:
/**
* 最大的可整合的子数组长度
*/
public int theLargestSubstring(int [] arr){
if(arr == null)
return 0;
int length = 0;
int min = 0;
int max = 0;
Set<Integer>hashset = new HashSet<Integer>();
for(int i=0;i<arr.length;i++){
min = Integer.MAX_VALUE;
max = Integer.MIN_VALUE;
for(int j=i;j<arr.length;j++){
if(hashset.contains(arr[j])){
break;
}
hashset.add(arr[j]);
min = Math.min(min, arr[j]);
max = Math.max(max, arr[j]);
if(j - i == max - min)
length = Math.max(length, j - i + 1);
}
hashset.clear();
}
return length;
}