【编程题】求数组中差值最大(Java实现)
题目描述
给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度0(N),且要求不能用非基于比较的排序。
解答一
思路
建立一个桶,桶的个数为数组的长度加一,每个桶存3个值,一个最大值,一个最小值,一个boolean值,将数组最大减最小分成n份放入桶,则一定有一个桶为空桶。所以最大值一定在两个桶之间,不在一个桶内。依次遍历桶的最大个最小,将右边的最小减左边的最大,得到的最大值即所求的最大值。
代码
public class MaxGap {
public static void main(String[] args){
int[] arr={3,4,2,1,4,2,5,7};
int x= maxGap(arr);
System.out.println(x);
}
public static int maxGap(int[] arr){
if(arr==null||arr.length<2)
return 0;
int len=arr.length;
int min=Integer.MAX_VALUE;
int max=Integer.MIN_VALUE;
for(int i=0;i<len;i++){
min=Math.min(min,arr[i]);
max=Math.max(max,arr[i]);
}
if(max==min)
return 0;
boolean[] hasNum=new boolean[len+1];
int[] minNum=new int[len+1];
int[] maxNum=new int[len+1];
int bid=0;
for(int i=0;i<len;i++){
bid=bucket(arr[i],len,min,max);
minNum[bid]=hasNum[bid]?Math.min(minNum[bid],arr[i]):arr[i];
maxNum[bid]=hasNum[bid]?Math.max(minNum[bid],arr[i]):arr[i];
hasNum[bid]=true;
}
int print=0;
int lastMax=maxNum[0];
for(int i=1;i<len+1;i++){
if(hasNum[i]){
print=Math.max(print,minNum[i]-lastMax);
lastMax=maxNum[i];
}
}
return print;
}
public static int bucket(int num,int len,int min,int max){
return (int)((num-min)*len/(max-min));
}
}