1.求一个无序数组排好序后,相邻元素差值最大为多少,时间复杂度为O(N)
思路:设数组的长度为len,创建三个长度为len+1的(桶)数组。将数组的元素根据大小放在不同的桶中,其中,必定有差值大于一个桶的差存在,故同一个桶中不可能出现差值最大的。三个数组,一个为maxs,一个为mins,一个为hasNum.
package algorithm;
/**
* 求一个无序数组排好序后,相邻元素差值最大为多少,时间复杂度为O(N)
* 用桶排序
* @author hasee
*
*/
public class MaxGap {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {1,8,3,6,8,0,4,13,16};
int res = maxGap(arr);
System.out.println(res);
}
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(arr[i], min);
max = Math.max(arr[i], max);
}
if(min == max) {
return 0;
}
boolean[] hasNum = new boolean[len+1];
int[] mins = new int[len+1];
int[] maxs = new int[len+1];
int bid = 0;
for(int j = 0;j < len;j++) {
bid = bucket(arr[j],len,min,max);
//System.out.println(bid);
mins[bid] = hasNum[bid]?Math.min(arr[j], mins[bid]):arr[j];
maxs[bid] = hasNum[bid]?Math.max(arr[j], maxs[bid]):arr[j];
hasNum[bid] = true;
}
//开始计算差值
int res = 0;
int lastMax = maxs[0];
int i =1;
for(;i<=len;i++) {
if(hasNum[i]){
res = Math.max(res,mins[i]-lastMax);
lastMax = maxs[i];
}
}
return res;
}
private static int bucket(int i, int len, int min, int max) {
// TODO Auto-generated method stub
return (i-min)*len/(max-min);
}
}