[不一樣的劍指offer] 面試題41. 數據流中的中位數

數據流中的中位數

本博客所有出現的 [不一樣的劍指offer] 系列,個人認爲都比書上的題解更好理解。

概括:書上的題目在實現兩個數據結構的平衡的地方寫的有點囉嗦。這裏分別有兩種方法實現,要簡單很多。

1 優先級隊列

class MedianFinder {
    priority_queue<int> lo;                              // 大頂堆 左半邊 從大到小 大的先出
    //priority_queue<int, vector<int>, less<int> > lo; //相當於這樣寫
    priority_queue<int, vector<int>, greater<int>> hi;   // 小頂堆

public:
    // Adds a number into the data structure.
    void addNum(int num) {
        lo.push(num);                                    // 加到大頂堆

        hi.push(lo.top());                               // 平衡

        lo.pop();

        if (lo.size() < hi.size()) {                     // 維護兩個堆元素個數
            lo.push(hi.top());
            hi.pop();
        }
    }

    // Returns the median of current data stream
    double findMedian() {
        return lo.size() > hi.size() ? (double) lo.top() : (lo.top() + hi.top())*0.5;
    }
};

2 multiset

class MedianFinder2 {
public:
    /** initialize your data structure here. */
    multiset<int, less<>> min_set;//最小值放前面 對應排序數組的右半邊
    multiset<int, greater<>> max_set;//最大值放前面,對應排序數組的左半邊
    MedianFinder2() {
    }
    void addNum(int num) {
        max_set.insert(num);
        min_set.insert(*max_set.begin());
        max_set.erase(max_set.find(*max_set.begin()));
        if(max_set.size()<min_set.size()){
            max_set.insert(*min_set.begin());
            min_set.erase(min_set.find(*min_set.begin()));
        }
    }
    double findMedian() {
        return max_set.size()>min_set.size()?*max_set.begin(): (double(*min_set.begin())+double(*max_set.begin()))/2;
    }
};

個人見解,歡迎討論指教!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章