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.
这题是桶排序的应用,其实不需要完全的排序。只需要计算出相邻桶之间的元素的差值。所以每个桶里面只需要维护两个元素即可,最大和最小的。
注意肯定有的桶是空桶,注意跳过。
桶的单位大小是(max-min)/nums.size()+1;
代码如下:
int maximumGap(vector<int>& nums) {
if(nums.size()<2) return 0;
int min=nums[0],max=nums[0];
for(int i=1;i<nums.size();i++)
{
min=min>nums[i]?nums[i]:min;
max=max<nums[i]?nums[i]:max;
}
//得到了min和max,可以分桶了
int bucket_size=(max-min)/nums.size()+1;
vector<vector<int> > bucket((max-min)/bucket_size+1);
for(int i=0;i<nums.size();i++)
{
int index=(nums[i]-min)/bucket_size;
if(bucket[index].empty())
{
bucket[index].push_back(nums[i]);
bucket[index].push_back(nums[i]);
}else{
bucket[index][0]= bucket[index][0]>nums[i]?nums[i]:bucket[index][0];
bucket[index][1]= bucket[index][1]<nums[i]?nums[i]:bucket[index][1];
}
}
int prev=0;
int maxgap=INT_MIN;
for(int i=1;i<bucket.size();i++)
{
if(bucket[i].empty()) continue;
int gap=bucket[i][0]-bucket[prev][1];
prev=i;
maxgap=maxgap<gap?gap:maxgap;
}
return maxgap;
}
leetcode的solution说明:
Suppose there are N elements and they range from A to B.
Then the maximum gap will be no smaller than ceiling[(B - A) / (N - 1)]
Let the length of a bucket to be len = ceiling[(B - A) / (N - 1)], then we will have at most num = (B - A) / len + 1 of bucket
for any number K in the array, we can easily find out which bucket it belongs by calculating loc = (K - A) / len and therefore maintain the maximum and minimum elements in each bucket.
Since the maximum difference between elements in the same buckets will be at most len - 1, so the final answer will not be taken from two elements in the same buckets.
For each non-empty buckets p, find the next non-empty buckets q, then q.min - p.max could be the potential answer to the question. Return the maximum of all those values.