JZ41 数据流中的中位数

通过使用大根堆和小根堆,本文介绍了如何在数据流中实时计算中位数。当数据流中数值数量为奇数时,中位数为堆中中间的数值;若为偶数,则是两个中间数值的平均值。代码实现利用了C++的priority_queue特性,保证了在O(nlogn)的时间复杂度和O(n)的空间复杂度内解决该问题。

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

题目来源:https://www.nowcoder.com/practice/9be0172896bd43948f8a32fb954e1be1?tpId=13&tqId=23457&ru=%2Fpractice%2F6a296eb82cf844ca8539b57c23e6e9bf&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking&sourceUrl=icon-default.png?t=M276https://www.nowcoder.com/practice/9be0172896bd43948f8a32fb954e1be1?tpId=13&tqId=23457&ru=%2Fpractice%2F6a296eb82cf844ca8539b57c23e6e9bf&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking&sourceUrl= 

描述

如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。

数据范围:数据流中数个数满足1≤n≤1000  ,大小满足 \1≤val≤1000 

进阶: 空间复杂度O(n)  , 时间复杂度O(nlogn) 

我的代码:

采用一个大根堆和一个小根堆来实现,大根堆存放较小的一半元素,小根堆存放较大的一般元素。

这里用了priority_queue与queue的区别是,前者可以定义压出的优先级。

class Solution {
public:
    priority_queue<int> max_heap;//最大栈,按照从大到小
    priority_queue<int, vector<int>, greater<int>> min_heap;//最小栈,按照从小到大排序
    
    void Insert(int num) {
        if(max_heap.empty() || max_heap.top()>num) max_heap.push(num);
        else min_heap.push(num);
        
        int a=max_heap.size(), b=min_heap.size();
        if(a-b>1){
            int cur = max_heap.top();
            max_heap.pop();
            min_heap.push(cur);
        }
        else if(b>a){
            int cur = min_heap.top();
            min_heap.pop();
            max_heap.push(cur);
        }
    }

    double GetMedian() {
        //double re;
        if(max_heap.size() == min_heap.size()){//偶数个数据
            return (max_heap.top()+min_heap.top())/2.0;
        }
        return (double)max_heap.top();
    }

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值