[LeetCode164]Maximum Gap

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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章