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;
};

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

时间: 2024-10-11 16:22:47

62 数据流中的中位数的相关文章

[剑指Offer] 62.数据流中的中位数

题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 1 class Solution { 2 public: 3 vector<int> vec; 4 void Insert(int num) 5 { 6 vec.push_back(num); 7 } 8 9 double GetMedian() 10 { 11 sort(vec.begin(),v

剑指offer(六十三)之数据流中的中位数

题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 代码: import java.util.*; public class Solution { ArrayList<Integer> al = new ArrayList<Integer>(); public void Insert(Integer num) { al.add(num);

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

题目描述: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 本题最开始简单的理解为求中位数,使用的是快排的思想,当数据元素为奇数个时,求第n/2大的数,当元素个数为偶数时,先求n/2个数,然后对右边的求出一个最小值. 看了别人的做法,发现应该把这道题理解为一个在线算法题.关键是使用两个堆,最大化堆存储前n/2个数,最小化堆存储后n/2个数,当元素个数为偶数个

数据流中的中位数

如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. import java.util.*; public class Solution { private int count = 0; private PriorityQueue<Integer> minHeap = new PriorityQueue<>(); private PriorityQu

数据流中的中位数-剑指Offer

数据流中的中位数 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 思路 我们可以用数组存,每次取中位数时需要排序 我们也可以用平衡二叉树存,不过构造树的过程很复杂 我们也可以用大小堆存,不过也不简单 最后我选择用java里现成的ArrayList存,用Collections.sort()方法排序 代码 import java.util.ArrayL

《剑指offer》:[64]数据流中的中位数

题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数据排序后中间两个数的平均值. 例如:1,2,3,4,5的中位数为:3.1,2,3,4的中位数为:(2+3)/2=3. 方案一:采用Partition来解决.在[29]中我们讲过,快速查找中的Partition函数是十分重要,是一个比较常用的算法.所以这里我们采用partion函数来解决.从字符流里读字符,插入到一个无需的数组中的复杂度为

64 - 数据流中的中位数 || STL 堆

题目: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 思路解析 数据是从数据流读出,因此数组的个数是再逐渐的增加.如何选用一个容器,能够存储数据,并能够给出中位数. 无序数组:插入O(1) partation操作找出中位数 O(n) 有序数组:插入O(n) 找出中位数O(1) 有序链表:插入O(n) 找出中位数O(1) 搜索二叉树:插入O(logn)~O(

《剑指offer》数据流中的中位数

[ 声明:版权所有,转载请标明出处,请勿用于商业用途.  联系信箱:[email protected]] 题目链接:http://www.nowcoder.com/practice/9be0172896bd43948f8a32fb954e1be1?rp=4&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后

剑指Offer——数据流中的中位数

题目描述: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 分析: 插入排序. 代码: 1 class Solution { 2 public: 3 vector<int> v; 4 int vSize = 0; 5 void Insert(int num) { 6 v.push_back(num); 7 for(int i = vSize - 1; i