數據流中的中位數

題目描述

如何得到一個數據流中的中位數?如果從數據流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從數據流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。
參照劍指offer,用最大堆和最小堆實現

class Solution {
public:
    void Insert(int num)
    {
        if((max.size()+min.size())%2==0){//總長度是偶數,則新來的數字插入到最小堆
            if(max.size()>0&&num<max[0]){
                max.push_back(num);
                push_heap(max.begin(),max.end(),less<int>());
                num=max[0];
                pop_heap(max.begin(),max.end(),less<int>());
                max.pop_back();
            }
            min.push_back(num);
            push_heap(min.begin(),min.end(),greater<int>());
        }
        else{
            if(min.size()>0&&num>min[0]){
                min.push_back(num);
                push_heap(min.begin(),min.end(),greater<int>());
                num=min[0];
                pop_heap(min.begin(),min.end(),greater<int>());
                min.pop_back();
            }
            max.push_back(num);
            push_heap(max.begin(),max.end(),less<int>());
        }
    }
 
    double GetMedian()
    {
        if(max.size()==0&&min.size()==0)
            return -1;
        if((max.size()+min.size())&1==1)
            return min[0];
        else
            return (max[0]+min[0])/2.0;
    }
    vector<int> max;//左邊最大堆
    vector<int> min;//右邊最小堆
};


發佈了133 篇原創文章 · 獲贊 23 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章