LeetCode - Maximum Gap 题解

来源:互联网 发布:mac md文件阅读器 编辑:程序博客网 时间:2024/05/20 21:43

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)复杂度

不过用O(NlogN)的map做桶也能过

1.

class Solution {public:    int maximumGap(vector<int> &num) {        int n = num.size();        if(n < 2){            return 0;        }        for(auto a : num){            Map[a] = true;        }        auto it = Map.begin();        int last = it->first;        ++it;        int ans = 0;        for(; it != Map.end(); ++it){            ans = max(ans, it->first - last);            last = it->first;        }        return ans;    }private:    map<int, bool> Map;};
2. O(N)的算法,假设N个数的范围是A到B,那么答案一定不小于ceiling((B - A)/(N - 1))。所以桶的大小按照此值定义,最后的答案一定在间隔的桶中。

class Solution {public:    int maximumGap(vector<int> &num) {        int n = num.size();        if(n < 2){            return 0;        }        int B = *max_element(num.begin(), num.end());        int A = *min_element(num.begin(), num.end());        int len = (B - A - 1) / (n - 1) + 1;        int b_num = (B - A) / len + 1;        vector<Bucket> buckets(b_num);        for(auto i : num){            int index = (i - A) / len;            buckets[index].maxx = max(buckets[index].maxx, i);            buckets[index].minn = min(buckets[index].minn, i);        }        int ans = 0;        int last = A;        for(int i = 0; i < b_num; ++i){            if(buckets[i].maxx == INT_MIN){                continue;            }            ans = max(ans, buckets[i].minn - last);            last = buckets[i].maxx;        }        return ans;    }private:    struct Bucket{        int minn = INT_MAX;        int maxx = INT_MIN;    };};


0 0
原创粉丝点击