public static int maxGap(int [] nums){
if(nums == null || nums.length<2) return 0;
int len = nums.length;
int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;
for(int i=0;i<len;i++){
min = Math.min(min, nums[i]);
max = Math.max(max, nums[i]);
}
if(min == max) return 0;
boolean [] hasNum = new boolean[len+1];
int[] maxs = new int[len+1];
int[] mins = new int[len+1];
for(int i=0;i<len;i++){
int bucket = bucket(nums[i],len,min,max);
mins[bucket] = hasNum[bucket]?Math.min(mins[bucket], nums[i]):nums[i];
maxs[bucket] = hasNum[bucket]?Math.max(maxs[bucket], nums[i]):nums[i];
hasNum[bucket] = true;
}
int result = 0;
int lastMax = maxs[0];
for(int i=1;i<=len;i++){
if(hasNum[i]){
result = Math.max(result, mins[i]-lastMax);
lastMax = maxs[i];
}
}
return result;
}
private static int bucket(long num, long len, long min, long max) {
return (int)((num-min)*len/(max-min));
}