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;
    };
     
     
  • 相关阅读:
    怎样让人的一生价值最大
    [LeetCode][Java] Minimum Depth of Binary Tree
    KVC和KVO
    js获取单独一个checkbox是否被选中
    It&#39;s not a Bug, It&#39;s a Feature! (poj 1482 最短路SPFA+隐式图+位运算)
    超声波测距温度补偿
    系统封装接口层 cmsis_os
    STM32F4XX高效驱动篇2 I2C
    Stm32f103 ADC 学习笔记
    Stm32f103 DAC 学习笔记
  • 原文地址:https://www.cnblogs.com/dingxiaoqiang/p/8361691.html
Copyright © 2011-2022 走看看