剑指offer63:数据流中的中位数

题目来源:剑指offer63:数据流中的中位数

题目描述:

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

解题思路:

用一个大顶堆和一个小顶堆实现,两者包含数量相同或小顶堆数目多一。小顶堆和大顶堆数目相同则取平均数,否则取小顶堆的堆顶。用优先队列模拟堆。

class Solution {
public:
    void Insert(int num)
    {
        if(p1.empty()||num<p1.top())
            p1.push(num);
        else p2.push(num);
        if(p1.size()+1==p2.size()){
            p1.push(p2.top());
            p2.pop();
        }
        if(p1.size()==p2.size()+2){
            p2.push(p1.top());
            p1.pop();
        } 
    }

    double GetMedian()
    { 
        return p1.size()==p2.size()?(p1.top()+p2.top())/2.0:p1.top();
    }
    priority_queue<int,vector<int>,less<int>> p1;
    priority_queue<int,vector<int>,greater<int>> p2;
};
posted @ 2020-07-01 01:24  拉里拉里啦啦  阅读(113)  评论(0编辑  收藏  举报