Leetcode295.数据流的中位数(堆)

该博客介绍了如何利用两个堆(大顶堆和小顶堆)来实现在不断添加元素的情况下,动态计算数组中位数的方法。大顶堆存储较小的一半元素,小顶堆存储较大的一半。通过保持堆的平衡,确保中位数可以在常数时间内获取。代码展示了具体的实现过程,包括添加元素和找到中位数的函数。
摘要由CSDN通过智能技术生成

题目链接
求动态数组的中位数,我们可以用两个堆来求.(这个是很经典的面试题)
思想:分为两个堆 大顶堆对应有序序列的left(数据较小)部分 小顶堆对应有序序列的right(数据较大)部分
根据只需获得中间数的想法,可以将数据分为左右两边,一边以最大堆的形式实现,可以快速获得左侧最大数, 另一边则以最小堆的形式实现。
同时,要保证两个堆的数据长度相差不能过大.
代码如下:

class MedianFinder {
public:
    /** initialize your data structure here. */
    //分为两个堆 大顶堆对应有序序列的left部分 小顶堆对应有序序列的right部分
    priority_queue<int,vector<int>,less<> > left;//大顶堆
    priority_queue<int,vector<int>,greater<> > right;//小顶堆 
    MedianFinder() {
    }
    
    void addNum(int num) {
        if(left.size()==0&&right.size()==0){
            left.push(num);//刚开始如果都为空,那么先放入大顶堆left
            return ;
        }
        if(num>left.top()) right.push(num);//以大顶堆top为基准,如果大于left.top(),则放入right
        else left.push(num);//反之,放入left
        if(right.size()>left.size()+1){//再考虑两个堆的数据长度 如果长度相差大于2 push pop
            left.push(right.top());
            right.pop();
        } else if(left.size()>right.size()+1){
            right.push(left.top());
            left.pop();
        }
    }
    
    double findMedian() {
        if(left.size()==right.size()) return (left.top()+right.top())/2.0;//如果两个堆的长度相同 说明是偶数,求两个top的平均数
        else return  left.size()>right.size()?left.top():right.top();//否则,为奇数,谁的数据长度大,则返回谁的top()
    }
};

/**
 * 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、付费专栏及课程。

余额充值