对顶堆动态维护中位数
对顶堆动态维护中位数
使用两个堆来维护一个数组的中位数,左堆为大根堆,右堆为小根堆,每次数组新加入一个数字,就轮流的
插入堆中,如果轮到左堆插入,就判断该值是否大于右堆的堆顶值,如果大于,就使右堆顶值弹出插入到左堆顶,
然后将新加入的值补充的右堆顶,当轮到右堆顶插入时逻辑相似。
总之,左堆的每一个值保证小于等于右堆的每一个值即可。
class Solution{
private:
int count = 0;
priority_queue<int> maxHeap; // 左顶堆
priority_queue<int,vector<int>,greater<int>> minHeap; // 右顶堆
public:
void addNum(int num) {
if(count%2==0){ // 当前有偶数个, 需要插入到右顶堆
if(!maxHeap.empty() && num<maxHeap.top()){
maxHeap.push(num);
num = maxHeap.top();
maxHeap.pop();
}
minHeap.push(num);
}else{ // 当前有奇数个, 需要插入到左顶堆
if(num>minHeap.top()){
minHeap.push(num);
num = minHeap.top();
minHeap.pop();
}
maxHeap.push(num);
}
++count;
}
double findMedian() {
if(count%2==0){
return (maxHeap.top()+minHeap.top()+0.0)/2;
}else{
return minHeap.top();
}
}
}

浙公网安备 33010602011771号