数据流的中位数

如何得到一个数据流中的中位数?

如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。

如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。

样例

1
2
3
4
5
输入:1, 2, 3, 4

输出:1,1.5,2,2.5

解释:每当数据流读入一个数据,就进行一次判断并输出当前的中位数。

代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Solution {
public:
    void insert(int num){
        //maxq 表示小根堆,top出来的是最大的那群数的最小值
        //minq 大根堆,最小那群数最大值
        maxq.push(num);
        while(minq.size() && minq.top() < maxq.top()) {
            //交换2个数,大的去小的,小的 去 maxq
            int ma = maxq.top();maxq.pop();
            int mi = minq.top();minq.pop();
            minq.push(ma),maxq.push(mi);
        }
        if(maxq.size() > minq.size() +1) {
            minq.push(maxq.top());
            maxq.pop();
        }
        
        //minq.size() == maxq.size() + 1
    }
    priority_queue<int> maxq;
    priority_queue<int,vector<int> ,greater<int> > minq;

    double getMedian(){
        int cnt = minq.size() +maxq.size();
        if(cnt & 1) return maxq.top();
        return ((double)minq.top() + maxq.top())/2;
    }
    
    
    
    
};