数据流中的中位数

构造两个堆,左大顶堆,右小顶堆。

如果奇数,中位数就是做大顶堆的root;如果是偶数,中位数就是两个顶堆root的平均值

class Solution {
private:
    vector<int> min;
    vector<int> max;
public:
    void Insert(int num)
    {
        if(((min.size()+max.size())&1)==0){
            //偶数
            //一般先都考虑左大顶堆,再考虑右小顶堆
            //若num大于右小顶堆root,那就直接放入右小顶堆,不用再考虑左大顶堆了
            if(min.size()>0 && num>min[0]){
                //如果大于左小顶堆root,就放入左小顶堆中
                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();
            }
            //num小于右小顶堆,所以放入左大顶堆
            max.push_back(num);
            push_heap(max.begin(),max.end(),less<int>());
        }
        else{
            //奇数
            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>());
        }
    }
    double GetMedian()
    {
        int len=min.size()+max.size();
        if(len<=0) return NULL;
        double middle=0;
        if((len&1)==0) middle=(double)(min[0]+max[0])/2;
        else middle=(double)max[0];
        return middle;
    }
};

 

posted @ 2019-07-30 13:44  Austin_anheqiao  阅读(127)  评论(0编辑  收藏  举报