题意理解
求不断增加数字的数组中中位数的变化。
问题分析
用堆。
一个小顶堆保存上半部分,一个大顶堆保存下半部分
没插入一个元素,根据当前元素和堆顶元素的比较选择一个堆存放,然后根据两个堆的数量调整两边元素,保证上半部分比下半部分大1.
其他
插入o(lgn),查找o(1).
链接
priority_queue<int, vector<int>, less<int>> small_heap; //存上半部分 小顶
priority_queue<int, vector<int>, greater<int>> big_heap; //存下半部分 大顶
public:
void Insert(int num)
{
if (small_heap.empty() || num <= small_heap.top()) { //上半部分为空 或者 当前数在小顶堆中
small_heap.push(num); //插入小顶堆
}
else {
big_heap.push(num); //否则插入大顶堆
}
if (small_heap.size() - big_heap.size() == -1) { //当小顶堆比大顶堆少一个
small_heap.push(big_heap.top()); //从大顶堆弹一个放入小顶堆
big_heap.pop();
}
if (small_heap.size() - big_heap.size() == 2) { //当小顶堆比大顶堆多两个
big_heap.push(small_heap.top()); //从小顶堆弹一个放入大顶堆
small_heap.pop();
}
}
double GetMedian()
{
if (small_heap.size() == big_heap.size()) { //左右堆长度相等,说明是偶数个
return (small_heap.top() + big_heap.top()) / 2.0; //取两个堆顶,求和除2.0
}
else {
return small_heap.top(); //取小顶堆元素
}
}