数据流中的中位数【牛客网】

212 篇文章 0 订阅
30 篇文章 0 订阅

题意理解

求不断增加数字的数组中中位数的变化。

问题分析

用堆。

一个小顶堆保存上半部分,一个大顶堆保存下半部分

没插入一个元素,根据当前元素和堆顶元素的比较选择一个堆存放,然后根据两个堆的数量调整两边元素,保证上半部分比下半部分大1.

其他

插入o(lgn),查找o(1).

链接

    priority_queue<int, vector<int>, less<int>> small_heap; //存上半部分 小顶
    priority_queue<int, vector<int>, greater<int>> big_heap;    //存下半部分 大顶
public:
    void Insert(int num)
    {
        if (small_heap.empty() || num <= small_heap.top()) {    //上半部分为空 或者 当前数在小顶堆中
            small_heap.push(num);    //插入小顶堆
        }
        else {
            big_heap.push(num);    //否则插入大顶堆
        }
        if (small_heap.size() - big_heap.size() == -1) {    //当小顶堆比大顶堆少一个
            small_heap.push(big_heap.top());    //从大顶堆弹一个放入小顶堆
            big_heap.pop();
        }
        if (small_heap.size() - big_heap.size() == 2) {    //当小顶堆比大顶堆多两个
            big_heap.push(small_heap.top());    //从小顶堆弹一个放入大顶堆
            small_heap.pop();
        }
    }

    double GetMedian()
    { 
        if (small_heap.size() == big_heap.size()) {    //左右堆长度相等,说明是偶数个
            return (small_heap.top() + big_heap.top()) / 2.0;    //取两个堆顶,求和除2.0
        }
        else {
            return small_heap.top();    //取小顶堆元素
        }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值