leetcode 295 : Find Median from Data Stream

本文介绍了一种高效的数据结构,用于实时维护数据流中的中位数。通过使用两个优先队列实现动态平衡,该方法能够在不断添加新元素的同时快速找到当前所有元素的中位数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、原题如下:
Median is the middle value in an ordered integer list. If the size of the list is even, there is no middle value. So the median is the mean of the two middle value.
Examples:
[2,3,4] , the median is 3
[2,3], the median is (2 + 3) / 2 = 2.5
Design a data structure that supports the following two operations:
void addNum(int num) - Add a integer number from the data stream to the data structure.
double findMedian() - Return the median of all elements so far.
For example:
add(1)
add(2)
findMedian() -> 1.5
add(3)
findMedian() -> 2

2、解答如下:

class MedianFinder {
public:
    priority_queue<int> less;
    priority_queue<int,vector<int>,greater<int>> bigger;
    //这里用两个priority_queue来存储,头文件functional不要忘记添加,less表示递减的且二分较小的队列,bigger表示递增且二分较大的队列
    void addNum(int num) {
        if(!less.empty()&&less.top()>num)
        {//如果less中的最大值比num大,num就需要被放到二分较小的队列,即less队列中
            less.push(num);
            if(less.size()>bigger.size())
            {//为了保证二分,我们进行下面的判断,一旦less队列的size比bigger队列的大,我们就把less中最大的交给bigger
                bigger.push(less.top());
                less.pop();
            }
        }
        else
        {//如果num本身大于less中的最大值,我们就要把它放入bigger中
            bigger.push(num);
            if(bigger.size()-less.size()==2)
            {//这里也是保证二分,一旦bigger的size比less大2,就把bigger中最小的给less
                    less.push(bigger.top());
                    bigger.pop();
            }
        }
    }

    // 从上面的添加方式可以看出,最后的结果无非bigger跟less的size相等,或者bigger多一个,分别对应有单独中间数或者两个中间数的情况,分别写出他们的值即可
    double findMedian() {
        if(bigger.size()==less.size())
        {
            return less.top()+(bigger.top()-less.top())/2.0;
        }
        else 
            return bigger.top();
    }

};

3、总结
(1)本题需要的头文件

#include<queue>
#include<algorithm>
#include<functional>
#include<vector>

(2)priority_queue

priority_queue::push();//按照优先级插入
priority_queue::pop();//删除队列的开头
priority_queue::empty();//判断是否为空
priority_queue::top();//队列的开头
priority_queue::size();//队列的长度(大小)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值