Given an unsorted array, find the maximum difference between the successive elements in its sorted form.
Try to solve it in linear time/space.
Return 0 if the array contains less than 2 elements.
You may assume all elements in the array are non-negative integers and fit in the 32-bit signed integer range.
public 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 i : nums){
min = Math.min(min, i);
max = Math.max(max, i);
}
int gap = (int)Math.ceil((double)(max - min) / (nums.length - 1));
int[] bucketMin = new int[nums.length - 1];
int[] bucketMax = new int[nums.length - 1];
Arrays.fill(bucketMax, Integer.MIN_VALUE);
Arrays.fill(bucketMin, Integer.MAX_VALUE);
for(int i : nums){
if(i == max || i == min){
continue;
}
int index = (i - min)/ gap;
bucketMin[index] = Math.min(bucketMin[index], i);
bucketMax[index] = Math.max(bucketMax[index], i);
}
int maxGap = Integer.MIN_VALUE;
int previous = min;
for (int i = 0; i < nums.length - 1; i++) {
if (bucketMin[i] == Integer.MAX_VALUE && bucketMax[i] == Integer.MIN_VALUE)
// empty bucket
continue;
// min value minus the previous value is the current gap
maxGap = Math.max(maxGap, bucketMin[i] - previous);
// update previous bucket value
previous = bucketMax[i];
}
maxGap = Math.max(maxGap, max - previous); // updata the final max value gap
return maxGap;
}
}