Leetcode 295. 數據流的中位數

中位數是有序列表中間的數。如果列表長度是偶數,中位數則是中間兩個數的平均值。

例如,

[2,3,4] 的中位數是 3

[2,3] 的中位數是 (2 + 3) / 2 = 2.5

設計一個支持以下兩種操作的數據結構:

  • void addNum(int num) - 從數據流中添加一個整數到數據結構中。
  • double findMedian() - 返回目前所有元素的中位數。

示例:

addNum(1)
addNum(2)
findMedian() -> 1.5
addNum(3) 
findMedian() -> 2

進階:

  1. 如果數據流中所有整數都在 0 到 100 範圍內,你將如何優化你的算法?
  2. 如果數據流中 99% 的整數都在 0 到 100 範圍內,你將如何優化你的算法?

用優先隊列模擬一個大堆和小堆。如果小堆的數量大於大堆,則最大數是小堆的堆頂。若相等,則中位數是(大堆的堆頂+小堆的堆頂)/2.
因爲堆的從大到小存放,所以大堆我們存放負數,就變成了(整數)從小到大的排放的。

class MedianFinder {
public:
    /** initialize your data structure here. */
    MedianFinder() {
        
    }
    
    void addNum(int num) 
    {
        small.push(num);
        large.push(-small.top());
        small.pop();
        if(small.size()<large.size())
        {
            small.push(-large.top());
            large.pop();
        }
    }
    
    double findMedian()
    {
        if(small.size()>large.size())
            return small.top();
        else
            return (small.top()-large.top())/2.0;
    }
private:
    priority_queue<int>small,large;
};

/**
 * Your MedianFinder object will be instantiated and called as such:
 * MedianFinder obj = new MedianFinder();
 * obj.addNum(num);
 * double param_2 = obj.findMedian();
 */

 

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