1.这个排序+比较
class Solution {
public int maximumGap(int[] nums) {
if(nums.length<2) return 0;
Arrays.sort(nums);
int max=0;
for(int i=1;i<nums.length;i++){
max=Math.max(max,nums[i]-nums[i-1]);
}
return max;
}
}
我才开始还以为这种做法会超时,现在我也不是很理解了
2.桶排序
class Solution {
public int maximumGap(int[] nums) {
if(nums.length<2) return 0;
int max=nums[0],min=nums[0];
int n=nums.length;
for(int i=1;i<n;i++){
max=Math.max(max,nums[i]);
min=Math.min(min,nums[i]);
}
if(max==min) return 0;
int interval=(int) Math.ceil((double)(max - min) / (n - 1));
int[] maxArr = new int[n-1];
int[] minArr = new int[n-1];
Arrays.fill(maxArr,-1);
Arrays.fill(minArr,Integer.MAX_VALUE);
for(int i=0;i<n-1;i++){
if(nums[i]==min||nums[i]==max){
continue;
}
int index = (nums[i]-min)/interval;
maxArr[index]=Math.max(maxArr[index],nums[i]);
minArr[index]=Math.min(minArr[index],nums[i]);
}
int maxGap=0;
int preMax=min;
for(int i=0;i<n-1;i++){
if(maxArr[i]==-1) continue;
maxGap=Math.max(maxGap,minArr[i]-preMax);
preMax=maxArr[i];
}
maxGap=Math.max(maxGap,max-preMax);
return maxGap;
}
}
这个桶排序确实挺复杂的,我感觉
以1,3,6,9为例,来举例说
对数字进行桶排序,就是放一排桶,每个桶中存放一个范围内的数字,这个范围和桶的个数由数组的最大值,最小值和数组长度控制
想象一下 1, 3,6, 9这个是3个有顺序的桶,如果想要得到最大差值,只要用当前桶的最小值减去上一个桶的最大值,就可以得到一个值,这个值可能就是最大差值
那么,这个范围和桶的个数是怎么得来的呢?
首先桶的个数应该有nums.length-1 首先我们可以去掉数组的最大值和最小值,因为最小值和最大值不需要参与这个最大差值的计算,主要参与的是两个桶之间的最小值,最大值,这时还有n-2个数
接下来,还必须保证有一个空箱子,这个空箱子可以保证,两个箱子之间的差值一定大于箱子内部的差值
2 空箱子 45 7 4-2肯定大于箱子内部的差值
当这些想明白了之后,就是操作了
用两个数组maxArr,minArr分别记录各个第i个桶的最大值最小值,遍历
在得到maxArr,minArr后,就计算两个桶的差值 preMax就象征着上一个桶的最大值