桶排序+鸽巢原理,这两部分知识都不是很熟悉,正好学习一下
class Solution {
public:
int maximumGap(vector<int>& nums) {
int n = nums.size();
if (n < 2) return 0;
int maxE = *max_element(nums.begin(), nums.end());
int minE = *min_element(nums.begin(), nums.end());
int len = maxE - minE;
if (len <= 1) return len;//Handle coner case.
vector<int> buck_max(n, INT_MIN);
vector<int> buck_min(n, INT_MAX);
for (int i = 0; i < n; i++) {
// note the divide and multiply order and the double cast
// it's used to avoid the overflow and underflow during calculation
int index = (double)(nums[i] - minE) / len * (n - 1);
buck_max[index] = max(buck_max[index], nums[i]);
buck_min[index] = min(buck_min[index], nums[i]);
}
int gap = 0, pre = buck_max[0];
for (int i = 1; i < n; i++) {
if (buck_max[i] == INT_MIN) continue;//Skip empty buket.
gap = max(gap, buck_min[i] - pre);
pre = buck_max[i];
}
return gap;
}
};
看完源代码后一直不了解所谓的相邻元素的最大差值不会小于ceiling[(B - A) / (N-1)],B是最大值,A是最小值,N是元素个数
直到看到了这个解释:
min + (n - 1)minStep = max
(n - 1)minStep = max - min
minStep = ceil((max - min) / (n - 1))