利用桶排序的思想,
import java.util.*;
public class MaxDivision {
public int findMaxDivision(int[] A, int n) {
// write code here
if (A == null || A.length < 2) {
return 0;
}
int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;
for (int i = 0; i < n; i++) { // 找到数组的最小值和最大值
if (A[i] < min) {
min = A[i];
}
if (A[i] > max) {
max = A[i];
}
}
if (min == max) {
return 0;
}
boolean[] hasNum = new boolean[n + 1]; // 标识桶中是否有数
int[] bMins = new int[n + 1]; // 桶中最小值
int[] bMaxs = new int[n + 1]; // 桶中最大值
for (int i = 0; i < n; i++) { // 统计每个桶中的最小值和最大值
int b = mapToBucket(A[i], n, min, max); // 当前元素所在的桶
if (hasNum[b]) {
if (A[i] < bMins[b]) {
bMins[b] = A[i];
}
if (A[i] > bMaxs[b]) {
bMaxs[b] = A[i];
}
} else {
bMins[b] = bMaxs[b] = A[i];
hasNum[b] = true;
}
}
int maxGap = 0;
int lastbMax = bMaxs[0]; // 前一个非空桶的最大值,第一个非空桶必是0号桶
int b = 1;
while (b <= n) {
if (hasNum[b]) {
if (bMins[b] - lastbMax > maxGap) { // 当前非空桶的最小值与上一个非空桶的最大值做差,取最大差值
maxGap = bMins[b] - lastbMax;
}
lastbMax = bMaxs[b];
}
b++;
}
return maxGap;
}
/**
* 映射函数,将数组元素映射到桶中,使用long类型防止相乘时溢出
*
* @param num
* @param n
* @param min
* @param max
* @return
*/
public int mapToBucket(long num, long n, long min, long max) {
return (int) ((num - min) * n / (max - min));
}
}