leetcode 295. 數據流的中位數(優先隊列 想法)

https://leetcode-cn.com/problems/find-median-from-data-stream/

題意:

給一個字節流,找出中位數

解析:

維護兩個size幾乎相同的堆,較大的一半數放在小頂堆,較小的一半數放在大頂堆。

中位數由兩個堆頂元素決定。

代碼:

class MedianFinder {
public:
    MedianFinder() {}
    priority_queue<int>Big;
    priority_queue<int,vector<int>,greater<int> >Small;

    void addNum(int num) {
        if(Small.empty()&&Big.empty())
            Big.push(num);
        else if(Small.empty())
            Big.push(num);
        else if(Big.empty())
            Small.push(num);
        else if(num<=Small.top())
            Big.push(num);
        else
            Small.push(num);

        if(Small.size()>Big.size()){
            Big.push(Small.top());
            Small.pop();
        }
        if(Big.size()-Small.size()>1){
            Small.push(Big.top());
            Big.pop();
        }
    }

    double findMedian() {
        int sum=Small.size()+Big.size();
        if(sum&1)
            return Big.top();
        else
            return 1.0*(Small.top()+Big.top())/2;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章