ref http://blog.csdn.net/u012162613/article/details/41936569
题目难点
1 理解桶排序
2 理解中间没有fill过的空桶,bucketMax = integer.min, 所以在之后算相邻的桶最大最小值差的时候必须不能考虑,因此用了个tmp来记录fill过的桶的最大值
public class Solution {
public int maximumGap(int[] num) {
// bucket sort
if(num==null || num.length<2) return 0; //bug
int min = num[0], max = min;
for(int i=0; i< num.length ; i++){
if (min> num[i]) min = num[i];
if(max< num[i]) max = num[i];
}
int len = (max-min)/(num.length-1); //bucket length, bucket has unlimit capacity
if (len == 0 ) return max-min;
int n = (max-min) / len +1; // buckets' number
int[] bucketMin = new int[n];
int[] bucketMax = new int[n];
for(int i=0; i<n; i++){ // padding the buckets
bucketMin[i]=Integer.MAX_VALUE;
bucketMax[i]=Integer.MIN_VALUE;
}
for(int i=0; i< num.length; i++){
int ind = (num[i]-min)/len;
bucketMin[ind] = Math.min(bucketMin[ind], num[i]); // fill in buckets
bucketMax[ind] = Math.max(bucketMax[ind], num[i]);
}
bucketMin[0] = min;
bucketMax[n-1] = max;
// 考虑怎么找到相邻的gapMax 问题: gap 必然出现在相邻桶的最大,最小之间
int res = Integer.MIN_VALUE;
int tmp = min;
for(int ind=0; ind < n; ind++){
if(bucketMin[ind]==Integer.MAX_VALUE || bucketMax[ind]==Integer.MIN_VALUE ) continue; // 针对没有fill 过的空桶,值为MAX/MIN 必须跳过
res = Math.max(res, bucketMin[ind]-tmp);
tmp = bucketMax[ind]; // 针对没有fill的空桶,不能将其bucketMax 考虑进去,所以记录tmp, 为之前计算过的桶的值
}
return res;
}
}