AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

AcWing 54. 数据流中的中位数    原题链接    困难

作者: 作者的头像   此题有解否 ,  2019-04-29 13:17:34 ,  所有人可见 ,  阅读 2146


2


2

题目描述

这题是大小堆的经典应用了,利用大小堆求解一个不断更新的数组的中位数。此时的做法就是利用大根堆存储前n/2到n/2+1个数字,小根堆存储剩下的数字,可以看出大根堆和小根堆的顶部就是我们需要的值。此时我们必须维护好两个堆中元素的个数关系,元素的大小关系,即大根堆的所有元素理应比小根堆的所有元素要小,如果违反了此规则,就需要进行元素的对换。


算法1

(暴力枚举) $O(n)$

C++ 代码

class Solution {
public:
    void insert(int num){
        maxHeap.push(num);
        if(maxHeap.size() > minHeap.size() + 1)
        {
            int t = maxHeap.top();
            maxHeap.pop();
            minHeap.push(t);
        }
        while(minHeap.size() && maxHeap.top() > minHeap.top())
        {
            int t1 = maxHeap.top();
            int t2 = minHeap.top();
            maxHeap.pop(); maxHeap.push(t2);
            minHeap.pop(); minHeap.push(t1);
        }
    }

    double getMedian(){
        int n1 = minHeap.size();
        int n2 = maxHeap.size();
        if(n1 == n2) return (minHeap.top() + maxHeap.top()) / 2.0;
        else return maxHeap.top();
    }
private:
    priority_queue<int> maxHeap;
    priority_queue<int, vector<int>, greater<int>> minHeap;
};

1 评论


用户头像
木落兮   2019-06-27 08:26         踩      回复

题目描述中“利用大根堆存储前n/2到n/2+1个数字”应该是大根堆存储前0~n/2-1的数字吧


App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息