题目描述
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。
这道题“剑指offer”上给出的思路有:
排序;
二叉搜索树;(记录节点的子节点数)
平衡二叉搜索树;(以节点的子节点数为平衡因子)
大、小堆(左边为最大堆,右边为最小堆,左边的数比右边的数小;左边数的总数目等于右边(中位数为堆顶平均数)或者比右边大1(中位数为左边堆顶数);)
参考代码(来自牛客网)
class Solution {
public:
priority_queue<int ,vector<int>,less<int> >p;
priority_queue<int ,vector<int>,greater<int> >q;
void Insert(int num)
{
if (p.empty() || num < p.top())
{
p.push(num);
}
else q.push(num);
if (p.size()==q.size()+2)
{
q.push(p.top());
p.pop();
}
if (p.size()+1==q.size())
{
p.push(q.top());
q.pop();
}
}
double GetMedian()
{
return p.size()==q.size()?(p.top()+q.top())/2.0:p.top();
}
};