题目来源:剑指offer63:数据流中的中位数
题目描述:
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。
解题思路:
用一个大顶堆和一个小顶堆实现,两者包含数量相同或小顶堆数目多一。小顶堆和大顶堆数目相同则取平均数,否则取小顶堆的堆顶。用优先队列模拟堆。
class Solution {
public:
void Insert(int num)
{
if(p1.empty()||num<p1.top())
p1.push(num);
else p2.push(num);
if(p1.size()+1==p2.size()){
p1.push(p2.top());
p2.pop();
}
if(p1.size()==p2.size()+2){
p2.push(p1.top());
p1.pop();
}
}
double GetMedian()
{
return p1.size()==p2.size()?(p1.top()+p2.top())/2.0:p1.top();
}
priority_queue<int,vector<int>,less<int>> p1;
priority_queue<int,vector<int>,greater<int>> p2;
};