zoukankan      html  css  js  c++  java
  • 62 数据流中的中位数

    题目描述

    如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
     
    思路:这道题用到两个堆,使用优先级队列进行实现,原始的优先级队列是最大堆,加上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;
    };
     
     
  • 相关阅读:
    CodeForces 7B
    CodeForces 4D
    离散化
    线段树入门
    洛谷 P3951 小凯的疑惑(赛瓦维斯特定理)
    Codeforces 1295D Same GCDs (欧拉函数)
    Codeforces 1295C Obtain The String (二分)
    Codeforces 1295B Infinite Prefixes
    Codeforces 1295A Display The Number(思维)
    Codeforces 1294F Three Paths on a Tree(树的直径,思维)
  • 原文地址:https://www.cnblogs.com/dingxiaoqiang/p/8361691.html
Copyright © 2011-2022 走看看