题目: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
解析:这道题最直接的解法是,先排序,得到有序数组,然后相邻元素相减,找出差最大的,时间复杂度 O(n log n) 。
然而本题要求 O(n) 时间,而桶排序的时间复杂度为 O(n),因此此题中我们可以使用桶排序,代码如下:
// 桶排序
// 时间复杂度 O(n),空间复杂度 O(n)
class Solution {
public:
int maximumGap(vector<int>& nums) {
if (nums.size() < 2) return 0;
bucketSort(nums);
int max_diff = INT_MIN;
for (int i = 1; i < nums.size(); ++i)
max_diff = max(max_diff, nums[i] - nums[i - 1]);
return max_diff;
}
private:
void bucketSort(vector<int>& nums) {
if (nums.size() < 2) return;
int min_val = INT_MAX;
int max_val = INT_MIN;
for (auto val : nums) {
min_val = min(min_val, val);
max_val = max(max_val, val);
}
const int diff = max_val - min_val;
const int len = nums.size();
vector<vector<int>> array(len); // 桶的数目为 len
for (auto val : nums) {
if (val == max_val)
array[len - 1].push_back(val);
double d = val - min_val;
else array[(int)(d / diff * len)].push_back(val);
}
for (int i = 0, index = 0; i < len; ++i) {
if (!array[i].empty()) {
sort(array[i].begin(), array[i].end());
for (auto val : array[i])
nums[index++] = val;
}
}
}
};