/**
* 求无序数组内相邻两个数的最大差值
* 可参考文章:
* https://www.cnblogs.com/xiaomoxian/p/5189782.html
*/
public class BucketSortExtMaxGap {
public static void main(String[] args) {
int arr[] = {1, 100, 20, 60, 101};
System.out.println(getMaxGap(arr));
}
private static Integer getMaxGap(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;
}
//初始化3个桶,分别记录 是否为空,最大值,最小值
boolean[] hasNum = new boolean[len + 1];
int[] maxs = new int[len + 1];
int[] mins = new int[len + 1];
int bid = 0;
for (int i = 0; i < len; i++) {
//选择所在的桶
bid = bucket(arr[i], len, min, max);
mins[bid] = hasNum[bid] ? Math.min(mins[bid], arr[i]) : arr[i];
maxs[bid] = hasNum[bid] ? Math.max(maxs[bid], arr[i]) : arr[i];
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;
}
/**
* 确定值所属的桶 ? 这个是怎么算出来的?
*
* @param num
* @param len
* @param min
* @param max
* @return
*/
public static int bucket(long num, long len, long min, long max) {
int index = (int) ((num - min) * len / (max - min));
//System.out.println("index = " + index);
return index;
}
}