HARD
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.
Credits:
Special thanks to @porker2008 for adding this problem and creating all test cases.
Hide Tags Sort
這題不是收費題,就是一道bucket sort。。但也研究了好久。
這個鏈接講的蠻好的:
https://leetcode.com/discuss/51039/12ms-c-suggested-solution
這道題要找最大的兩個元素(sort之後相鄰)的gap, 所以假如array是: 1,9,2,5。 sort完:1,2,5,9。最大gap是4。對於array, size = 4, lower = 1, upper = 9,所以我們可以猜測其gap至少爲3(1,3,8,9)。 bucket 有多少個呢? gap至少是3, 最大最小元素之差是8, 要把四個number裝進buckt 則m = (u - l) / 3 + 1 = 3 個。具體講起來就跟鏈接說的一樣,只不過很多很精妙的處理啊,學渣肯定不會啊。。所以要好好研究一下!
ps: c++的auto lu = minmax_element(nums.begin(), nums.end());
簡直讓我沒聽說過。所以最小元素是 lower = *lu.first
最大元素是upper = *lu.second
貼上code:
class Solution {
public:
int maximumGap(vector<int>& nums) {
if (nums.size()<2) return 0;
auto lu = minmax_element(nums.begin(), nums.end());
int l = *lu.first;
int u = *lu.second;
int n = nums.size();
int gap = max((u-l)/(n-1), 1);
int m = (u-l)/gap + 1;
vector<int> minBucket(m,INT_MAX);
vector<int> maxBucket(m,INT_MIN);
for (int num : nums){
int k = (num - l)/gap;
if (num < minBucket[k]) minBucket[k] = num;
if (num > maxBucket[k]) maxBucket[k] = num;
}
int i=0, j = 0;
gap = maxBucket[0] - minBucket[0];
while (i<m) {
j = i+1;
while (j<m && minBucket[j] == INT_MAX && maxBucket[j] == INT_MIN) {
++j;
}
if (j == m) break;
gap = max((minBucket[j] - maxBucket[i]), gap);
i = j;
}
return gap;
}
};