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.
解法:
桶排序,首先找到数组的最大值和最小值,然后设置gap为最大值和最小值的差距除以数组长度,那么我们所需要找到的max值则可以通过遍历每个桶,求当前桶的最大值和下一个桶的最小值的差距,这个差距的最大值即为所求。
代码:
class Solution {
public:
int maximumGap(vector<int>& nums) {
if(nums.size() < 2)
return 0;
if(nums.size() == 2)
return abs(nums[0]-nums[1]);
int maxnum = nums[0];
int minnum = nums[0];
for(int i = 0; i < nums.size(); i ++)
{
maxnum = max(maxnum, nums[i]);
minnum = min(minnum, nums[i]);
}
int gap = ceil((double)(maxnum-minnum)/nums.size());
if(gap == 0)
return 0;
int len = (maxnum-minnum)/gap+1;
int maxi[len];
int mini[len];
for(int i = 0; i < len; i ++)
{
maxi[i] = minnum;
mini[i] = maxnum;
}
int rank = 0;
for(int i = 0; i < nums.size(); i ++)
{
rank = (nums[i] - minnum) / gap;
maxi[rank] = max(maxi[rank],nums[i]);
mini[rank] = min(mini[rank],nums[i]);
}
int ans = 0;
int tempmax = maxi[0];
for(int i = 1; i < len; i ++)
{
if(maxi[i] == minnum && mini[i] == maxnum)
continue;
else
{
ans = max(ans,(mini[i]-tempmax));
tempmax = maxi[i];
}
// ans = max(ans, (mini[i]-maxi[i-1]));
}
return ans;
}
};
注意:
1 gap可能为0
2 有的桶可能为空,所以不能简单的下一个桶的最小值减去当前桶的最大值。