164. Maximum Gap
Hard
450124FavoriteShare
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.
题意:在线性时间内找到相连数之间的最大间隙。
思路:这是桶排序的经典应用了。基于这样的思考,相邻数之间的最大间隙一定大于或等于(max-min)/(size-1)。所以设定每个桶的大小为(max-min)/(size-1);定义两个向量,一个向量记录桶中的最大值,一个向量记录桶的最小值。最大间隙为所有相连非空桶的后一个桶的最小值于前一个桶的最大值的差的最大值。
class Solution {
public:
int maximumGap(vector<int>& nums)
{
if(nums.size()<2) return 0;
int sizen = nums.size();
int maxn =nums[0],minn =nums[0];
int maxgap = INT_MIN;
for(int i=1;i<sizen;i++)
{
maxn = max(maxn,nums[i]);
minn = min(minn,nums[i]);
}
int len = (int)ceil((double)(maxn-minn)/(sizen-1));
if(len==0) return 0;
vector<int> maxb(sizen,INT_MIN);
vector<int> minb(sizen,INT_MAX);
for(int i=0;i<sizen;i++)
{
int id = (nums[i]-minn)/len;
maxb[id] = max(maxb[id],nums[i]);
minb[id] = min(minb[id],nums[i]);
}
for(int i=0;i<sizen;)
{
int j=i+1;
while(j<sizen && minb[j]==INT_MAX) j++;
if(j<sizen) maxgap = max(maxgap,minb[j]-maxb[i]);
i = j;
}
return maxgap;
}
};