Hard
Given an unsorted array, find the maximum difference between the successive elements in its sorted form.
Return 0 if the array contains less than 2 elements.
Example 1:
Input: [3,6,9,1] Output: 3 Explanation: The sorted form of the array is [1,3,6,9], either (3,6) or (6,9) has the maximum difference 3.
Example 2:
Input: [10] Output: 0 Explanation: The array contains less than 2 elements, therefore return 0.
Note:
- You may assume all elements in the array are non-negative integers and fit in the 32-bit signed integer range.
- Try to solve it in linear time/space.
思路:采用桶排序,一开始我采用n+1个桶,把min和max都加到桶里,但是还要考虑一些边界情况,比如:gap==0时除零;(max-min)/(len+1)为整数时,要考虑其他方法把max加进去,因为为整数时桶容纳的范围是[min,max),因此最终采用n-1个桶,不把min,max加到桶里,只把其余n-2个数加进去,值得注意的是,算maxGap时要记得考虑min,max,别遗漏了。
class Solution {
public int maximumGap(int[] nums) {
if(nums==null || nums.length<2)
return 0;
int min = nums[0];
int max = nums[0];
for(int num:nums){
min = Math.min(num,min);
max = Math.max(num,max);
}
int len = nums.length;
int gap = (int)Math.ceil((double)(max-min)/(len-1));
int[] bucketMin = new int[len-1];
int[] bucketMax = new int[len-1];
Arrays.fill(bucketMin,Integer.MAX_VALUE);
Arrays.fill(bucketMax,Integer.MIN_VALUE);
for(int num:nums){
if(num==min || num==max) continue;
int idx = (num-min)/gap;
bucketMin[idx] = Math.min(num,bucketMin[idx]);
bucketMax[idx] = Math.max(num,bucketMax[idx]);
}
int maxGap = Integer.MIN_VALUE;
int pre = min;
for(int i=0;i<len-1;i++){
if(bucketMin[i]==Integer.MAX_VALUE&&bucketMax[i]==Integer.MIN_VALUE)
continue;
maxGap = Math.max(maxGap,bucketMin[i]-pre);
pre = bucketMax[i];
}
return Math.max(maxGap,max-pre);
}
}