数据流的中位数

用一个大根堆和一个小根堆动态维护,并且①大根堆最大数字小于小根堆最小②小根堆大小+1>=大根堆的大小>=小根堆的大小
那么当添加一个数字的时候只需考虑,如何改变队列而不影响上面两个条件,有两种情况:
①当前两个队列大小相等,那么要将小根堆中的数字和当前 数字里最小的插入大根堆。
②不等,则相反。

class MedianFinder {
    priority_queue<int>p;
    priority_queue<int,vector<int>,greater<int>>q;
public:
    /** initialize your data structure here. */
    MedianFinder() {
        while(!p.empty()) p.pop();
        while(!q.empty()) q.pop();
    }
    
    void addNum(int num) {
        if(p.size()==q.size()) {
            q.push(num);
            p.push(q.top());
            q.pop();
        }
        else {
            p.push(num);
            q.push(p.top());
            p.pop();
        }
    }
    double findMedian() {
        int n=q.size()+p.size();
        if(n&1) return p.top();
        return 1.0*(p.top()+q.top())/2;
    }
};

/**
 * Your MedianFinder object will be instantiated and called as such:
 * MedianFinder* obj = new MedianFinder();
 * obj->addNum(num);
 * double param_2 = obj->findMedian();
 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值