题目描述
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。
思路:
使用两个优先队列,一个是大顶堆(自顶向下,越来越小)q1,一个是小顶堆(自顶向下,越来越大)q2:
priority_queue<int, vector<int>, less<int> > q1;
priority_queue<int, vector<int>, greater<int> > q2;
保证大顶堆中的数字始终小于等于小顶堆中的数字,且q1与q2长度差不超过1.
如果q1.size() == q2.size() + 2,那么就将q1队首元素给q2,q1.pop().那么中位数是两个队列的队首元素的平均值。
如果q1.size() + 1 == q2.size() ,那么就将q2队首元素给q1,q2.pop()那么中位数是大顶堆的队首元素。
class Solution {
public:
priority_queue<int, vector<int>, less<int> > q1;
priority_queue<int, vector<int>, greater<int> > q2;
void Insert(int num)
{
if(q1.empty() || num < q1.top())
q1.push(num);
else
q2.push(num);
if(q1.size() == q2.size() + 2)
{
q2.push(q1.top());
q1.pop();
}
if(q1.size() + 1 == q2.size())
{
q1.push(q2.top());
q2.pop();
}
}
double GetMedian()
{
if(q1.size() == q2.size())
return (q1.top() + q2.top())/2.0;
else
return q1.top();
}
};