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.
比较困难啊,bucket排序的思想。最小的gap是N个数均匀分布的情况,(max - min) / (N - 1)。把N个数分成(N-1)个bucket,那么最大的gap不会在同一个bucket之内,因为这时bucket的大小为(max - min) / (N - 1);所以只需计算前一个bucket的最大值和下一个bucket的最小值的gap。
class Solution {
public:
int maximumGap(vector<int>& nums) {
if (nums.size() < 2) {
return 0;
}
auto minMax = minmax_element(nums.begin(), nums.end());
int minNum = *minMax.first;
int maxNum = *minMax.second;
int bucketSize = max((maxNum - minNum) / (static_cast<int>(nums.size()) - 1), 1);
int bucketNum = (maxNum - minNum) / bucketSize + 1;
vector<int> bucketMin(bucketNum, INT_MAX);
vector<int> bucketMax(bucketNum, INT_MIN);
for (const auto& num : nums) {
int index = (num - minNum) / bucketSize;
bucketMin[index] = min(bucketMin[index], num);
bucketMax[index] = max(bucketMax[index], num);
}
int maxGap = bucketMax[0] - bucketMin[0];
int prevMax = bucketMax[0];
for (int i = 1; i < bucketMin.size(); ++i) {
if (bucketMin[i] == INT_MAX) {
continue;
}
maxGap = max(maxGap, bucketMin[i] - prevMax);
prevMax = bucketMax[i];
}
return maxGap;
}
};