题解 | #数据流中的中位数#
数据流中的中位数
https://www.nowcoder.com/practice/9be0172896bd43948f8a32fb954e1be1
将当前序列维护为 两个堆,一个大根堆,一个小根堆(初始化一个大根堆,存中位数左边的数据,一个小根堆,存中位数右边的数据),则 中位数 一定在 大根堆 和 小根堆的堆顶 产生。确保 大根堆 中元素个数比 小根堆 元素个数多一个,每次有新元素进入时,先放入 大根堆中,这时比较 大根堆的堆顶和小根堆的堆顶,如果出现 大根堆的堆顶元素比小根堆的堆顶元素大,就交换这两个堆顶元素,由于每次都是将元素放入 大根堆,就可能会出现 大根堆元素个数比 小根堆 元素个数多一个以上,那么就将 大根堆的一个元素 转移到小根堆上。
class Solution {
public:
//大根堆
priority_queue<int> max_heap;
//小根堆
priority_queue<int,vector<int>,greater<int>> min_heap;
void Insert(int num) {
max_heap.push(num);
//如果大根堆的堆顶元素比小根堆的堆顶元素大,就交换
if(!min_heap.empty()&&max_heap.top()>min_heap.top())
{
int maxV=max_heap.top();
int minV=min_heap.top();
max_heap.pop();
max_heap.push(minV);
min_heap.pop();
min_heap.push(maxV);
}
//大根堆的元素个数比小根堆的元素个数多于一个
if(max_heap.size()-min_heap.size()>1)
{
//将大根堆的堆顶元素放入到小根堆中
min_heap.push(max_heap.top());
max_heap.pop();
}
}
double GetMedian() {
//奇数个元素,中位数就在 大根堆中
if(max_heap.size()+min_heap.size()&1)
{
return max_heap.top();
}
//一定要使用浮点数运算
return (max_heap.top()+min_heap.top())/2.0;
}
};
#剑指offer#