题目描述
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用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 };