桶排序,n个数,n+1个桶,因为鸽巢原理,最大间隔在桶间
有个问题,就是如果求索引那块代码,如果用int就报错,贼烦
class Solution {
public int maximumGap(int[] nums) {
if(nums.length<=1){
return 0;
}
int len=nums.length;//n个数 n+1个桶
int min=Integer.MAX_VALUE;
int max=Integer.MIN_VALUE;
int res=0;
for(int num:nums){
min=Math.min(min,num);
max=Math.max(max,num);
}
if(min==max){
return 0;
}
boolean[] flag=new boolean[len+1];
int[] mins=new int[len+1];
int[] maxs=new int[len+1];
for(int i=0;i<nums.length;i++){
int index=index(nums[i],len,min,max);
if(flag[index]){
mins[index]=Math.min(nums[i],mins[index]);
maxs[index]=Math.max(nums[i],maxs[index]);
}else{
mins[index]=nums[i];
maxs[index]=nums[i];
flag[index]=true;
}
}
int lastMax=maxs[0];
for (int i=1; i <= len; i++) {
if (flag[i]) {
res = Math.max(res, mins[i] - lastMax);
lastMax = maxs[i];
}
}
return res;
}
//返回元素在的桶号,这里必须是long,否则就会出错,可能做乘法,int精度不够,出现了一些乱七八糟的值,负数。。
public int index(long num,long len,long min,long max){
return (int)((num-min)*len/(max-min));
}
}