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.
解法来自于评论区:
class Solution {
public int maximumGap(int[] nums) {
if(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[] bucketsMIN = new int[nums.length - 1];
int[] bucketsMAX = new int[nums.length - 1];
Arrays.fill(bucketsMIN, Integer.MAX_VALUE);
Arrays.fill(bucketsMAX, Integer.MIN_VALUE);
for(int i : nums)
{
if(i == min || i == max) continue;
else
{
int bucketid = (i - min) / gap;
bucketsMIN[bucketid] = Math.min(bucketsMIN[bucketid], i);
bucketsMAX[bucketid] = Math.max(bucketsMAX[bucketid], i);
}
}
int maxgap = 0;
int prev = min;
for(int i = 0; i < nums.length - 1; i++)
{
if(bucketsMIN[i] == Integer.MAX_VALUE && bucketsMAX[i] == Integer.MIN_VALUE)
continue;
maxgap = Math.max(maxgap, bucketsMIN[i] - prev);
prev = bucketsMAX[i];
}
maxgap = Math.max(maxgap, max - prev);
return maxgap;
}
}