zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    ubuntu 11.10(32位系统)下编译android源码
    12 个基于 Rails 框架开发的 CMS 系统
    36 个 CSS 框架推荐
    再来 10 个新鲜的 HTML5 教程
    汇编程序开发环境搭配(转)
    推荐:介绍一个UndoFramework
    细数 Windows 平台上的 NoSQL 数据库
    使用ShareKit一键分享到Facebook,Twitter等平台
    25个jQuery的编程小抄
    10款iOS高效开发必备的ObjectiveC类库
  • 原文地址:https://www.cnblogs.com/lailailai/p/4176322.html
Copyright © 2011-2022 走看看