-
Notifications
You must be signed in to change notification settings - Fork 0
/
64.数据流中的中位数.cpp
36 lines (34 loc) · 1.16 KB
/
64.数据流中的中位数.cpp
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
33
34
35
36
//64
// 题目描述
// 如何得到一个数据流中的中位数?
// 如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。
// 如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
/**
* 保持 大顶堆元素个数 >= 小顶堆+1 */
class Solution {
priority_queue<int, vector<int>, less<int> > bigheap;
priority_queue<int, vector<int>, greater<int> > smallheap;
public:
void Insert(int num)
{
if(bigheap.empty() || num <= bigheap.top())
bigheap.push(num);
else
smallheap.push(num);
if(bigheap.size() == smallheap.size() + 2)
{
smallheap.push(bigheap.top());
bigheap.pop();
}
if(bigheap.size() + 1 == smallheap.size())
{
bigheap.push(smallheap.top());
smallheap.pop();
}
}
double GetMedian()
{
return bigheap.size() == smallheap.size() ? (bigheap.top() + smallheap.top()) / 2.0 : bigheap.top();
}
};