LeetCode Maximum Gap

class Solution {

public:

    int maximumGap(vector<int> &num) {

        int len = num.size();

        int gap = 0;

        sort(num.begin(), num.end());

        for (int i=0; i<len-1; i++) {

            int cgap = num[i+1] - num[i];

            if (cgap > gap) {

                gap = cgap;

            }

        }

        return gap;

    }

};

等会去看下discuss,找了一个使用基数排序的,发现比快排多了一倍的时间。

第二轮:

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.

只能说自己实现的挫:

#include <iostream>

#include <map>

#include <vector>

#include <cmath>



using namespace std;





class Bucket {

private:

    int min_value;

    int max_value;

    int idx;

    bool isempty;

public:

    Bucket() : min_value(INT_MAX), max_value(INT_MIN) {

        isempty = true;

    }

    void push(int v) {

        if (min_value > v) {

            min_value = v;

        }

        if (max_value < v) {

            max_value = v;

        }

        isempty = false;

    }

    bool empty() {return isempty;}

    int getMax() {return max_value;}

    int getMin() {return min_value;}

    int getIdx() {return idx;}

    void setIdx(int val) {idx = val;}

};



class Solution {

public:

    int maximumGap(vector<int> &num) {

        int n = num.size();



        if (n < 2) {

            return 0;

        }



        int maxv = INT_MIN;

        int minv = INT_MAX;

        for (int e : num) {

            if (e > maxv) {

                maxv = e;

            } else if (e < minv) {

                minv = e;

            }

        }



        int diff = maxv - minv;



        int min_gap = ceil(diff * 1.0 / (n-1));

        int bn = diff / min_gap + 1;



        map<int, Bucket> buckets;



        for (int e : num) {

            int idx = (e - minv) / min_gap;

            if (buckets.count(idx) < 1) {

                buckets[idx] = Bucket();

            }

            buckets[idx].push(e);

        }



        auto iter = buckets.begin();





        Bucket last = iter->second;

        int max_gap = last.getMax() - last.getMin();



        for (iter++;iter!=buckets.end();iter++) {

            int gap = iter->second.getMin() - last.getMax();

            if (gap > max_gap) {

                max_gap = gap;

            }

            gap = iter->second.getMax() - iter->second.getMin();

            if (gap > max_gap) {

                max_gap = gap;

            }

            last = iter->second;

        }

        return max_gap;

    }

};



int main() {

    vector<int> data  ={1,1,1,1,1,5,5,5,5,5};

    

    Solution s;

    int gap = s.maximumGap(data);

    cout<<gap<<endl;

    return 0;

}

 

你可能感兴趣的:(LeetCode)