题目描述
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数
class Solution {
private:
int count=0;
//大顶堆里的数字要全部小于小顶堆里的数字
priority_queue<int, vector<int>, less<int> > p;//加less<int>是大顶堆
priority_queue<int, vector<int>, greater<int> > q;//这个是小顶堆
public:
//用count记录两个堆的数字总数,当为奇数时,默认用p存放中位数
void Insert(int num)
{
if(count%2==0)p.push(num);
else q.push(num);
//这里有的类似于数学归纳法,当p和q的size都为1的时候,保证了p中的数都小于q中
//的数字,当k>1时,加入一个新数字后,再判断p中的数是不是全小于q中的数字,
//只用考虑极端情况,即新加入的数字在大顶堆p中最大的情况或者新加入的数字在
//小顶堆q中最小的情况,此时只需要比较大顶堆的top和小顶堆的top,就可以保证
//大顶堆中的数全小于小顶堆中的数。
if(p.size()!=0&&q.size()!=0&&p.top()>q.top())
{
int a=p.top(),b=q.top();
p.pop(),q.pop();
q.push(a),p.push(b);
}
++count;
}
double GetMedian()
{
if(p.size()==q.size())return (p.top()+q.top())/2.0;
else return p.top();
}
};