剑指offer 数据流中的中位数

Posted qinduanyinghua

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer 数据流中的中位数相关的知识,希望对你有一定的参考价值。

题目描述

如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。
 
 
思路:利用两个优先队列,最大堆始终保存前一半数据,最小堆始终保存后一半数据,当两个优先队列长度一样时,将数压入最小堆。
 1 class Solution 
 2     priority_queue<int, vector<int>, less<int> > p; //最大堆
 3     priority_queue<int, vector<int>, greater<int> > q; //最小堆
 4 public:
 5     void Insert(int num)
 6         
 7         //偶数个,应该压入最小堆
 8         if (((p.size() + q.size()) & 1) == 0) 
 9             if (p.size() > 0 && num < p.top()) 
10                 int temp = p.top();
11                 p.pop();
12                 p.push(num);
13                 q.push(temp);
14              else 
15                 q.push(num);
16             
17          else  //奇数个,应该压入最大堆,但是数可能比最小堆的最小值大
18             if (q.size() > 0 && num > q.top()) 
19                 int temp = q.top();
20                 q.pop();
21                 q.push(num);
22                 p.push(temp);
23              else 
24                 p.push(num);
25             
26         
27     
28 
29     double GetMedian()
30      
31         if (p.size() == q.size()) 
32             return (p.top() + q.top()) / 2.0;
33          else 
34             return q.top();
35         
36     
37     
38 
39 ;

 

以上是关于剑指offer 数据流中的中位数的主要内容,如果未能解决你的问题,请参考以下文章

剑指 Offer 41 数据流中的中位数(优先队列堆排序)

LeetCode12. 整数转罗马数字 / 剑指 Offer 40. 最小的k个数 / 剑指 Offer 41. 数据流中的中位数

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

剑指offer41. 数据流中的中位数

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

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