码迷,mamicode.com
首页 > 其他好文 > 详细

62 数据流中的中位数

时间:2018-01-27 00:35:13      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:scribe   优先级   平均值   仿函数   tor   题目   public   均值   class   

题目描述

如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
 
思路:这道题用到两个堆,使用优先级队列进行实现,原始的优先级队列是最大堆,加上greater仿函数之后是最小堆(加上functional头文件)
一定要保证前面的最大堆元素多于后面的最小堆元素,首先将元素压入最大堆,然后取出最小的元素压入最小堆,然后判断两者大小,最大堆数目小于最小堆,流需要压一个最小堆的元素到前面的最大堆。
最后得结果的时候,是奇数返回前面最大堆的top,否则数目不为0的时候,返回两个堆的top平均数。
class Solution {
public:
    void Insert(int num){
        maxHeap.push(num);
        int tmp = maxHeap.top();
        maxHeap.pop();
        minHeap.push(tmp);
        if(maxHeap.size() < minHeap.size()){
            maxHeap.push(minHeap.top());
            minHeap.pop();
        }
    }

    double GetMedian(){ 
        if(maxHeap.empty() && minHeap.empty()){
            return 0.0;
        }
        int sz = maxHeap.size() + minHeap.size();
        if(sz % 2 == 0){
            return (maxHeap.top() + minHeap.top()) / 2.0;
        }
        else{
            return maxHeap.top();
        }
        return 0.0;
    }
    
private:
    priority_queue<int> maxHeap;
    priority_queue<int,vector<int>,greater<int>> minHeap;
};

 

 
 

62 数据流中的中位数

标签:scribe   优先级   平均值   仿函数   tor   题目   public   均值   class   

原文地址:https://www.cnblogs.com/dingxiaoqiang/p/8361691.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!