1.题目
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。
2.我的题解
- 使用大顶堆
left
保存较小的一半数字,大顶堆right
保存较大的一半数字; - 插入时判断应该插入哪一个堆;
- 保证两个堆的大小之差不超过
1
,如果大小不同时,优先令左边的大顶堆规模更大;
class Solution {
priority_queue<int,vector<int>,less<int> > left;//大顶堆
priority_queue<int,vector<int>,greater<int> >right;//小顶堆
public:
void Insert(int num)
{
if(left.empty() || num<left.top())left.push(num);
else right.push(num);
if(left.size()>right.size()+1){
right.push(left.top());
left.pop();
}
if(right.size()>left.size()){
left.push(right.top());
right.pop();
}
}
double GetMedian()
{
if(left.empty() && right.empty())return 0;
if(left.size()==right.size()+1)return left.top();
return 0.5 * (left.top()+right.top());
}
};
3.别人的题解
4.总结与反思
(1)C++
中,priority_queue<int,vector< int >,less< int > >
默认的大顶堆;
priority_queue<int,vector< int >,greater< int > >
是小顶堆;