桶排序
class Solution {
public int maximumGap(int[] nums) {
int n = nums.length;
if(n < 2)//数组元素个数小于2 直接返回0
return 0;
//求数组元素最大值 最小值
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
for(int i = 0;i < n;i++){
max = Math.max(nums[i],max);
min = Math.min(min,nums[i]);
}
// 桶的大小
int bucketSize = Math.max((max-min) / (n-1),1);
//桶的数目
int bucketNum = (max-min)/bucketSize + 1;
//记录每个桶的最大值和最小值就好
int[][] bucket = new int[bucketNum][2];
//初始化桶 bucket[i][0] 存放第i个桶的最小值 bucket[i][1] 存放第i个桶的最大值
for(int i = 0; i < bucketNum;i++){
bucket[i][0] = Integer.MAX_VALUE;
bucket[i][1] = Integer.MIN_VALUE;
}
//将nums中的每个数相应的放入桶中
//index = (nums[i] - min) / bucketSize
for(int i = 0; i< n;i++){
int index = (nums[i] - min) / bucketSize;
bucket[index][0] = Math.min(bucket[index][0],nums[i]);
bucket[index][1] = Math.max(bucket[index][1],nums[i]);
}
int ans = 0;
int prevmax = Integer.MIN_VALUE;
for(int i = 0; i < bucketNum;i++){
//该桶不为空 且 该桶之前有不为空的桶
if(prevmax != Integer.MIN_VALUE && bucket[i][0] != Integer.MAX_VALUE)
{
ans = Math.max(ans,bucket[i][0] - prevmax);
}
if(bucket[i][1] != Integer.MIN_VALUE){
prevmax = bucket[i][1];
}
}
return ans;
}
}