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