对顶堆动态维护中位数

对顶堆动态维护中位数

使用两个堆来维护一个数组的中位数,左堆为大根堆,右堆为小根堆,每次数组新加入一个数字,就轮流的

插入堆中,如果轮到左堆插入,就判断该值是否大于右堆的堆顶值,如果大于,就使右堆顶值弹出插入到左堆顶,

然后将新加入的值补充的右堆顶,当轮到右堆顶插入时逻辑相似。

总之,左堆的每一个值保证小于等于右堆的每一个值即可。

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();
        }
    }
}

posted @ 2024-02-01 21:14  捏鼠  阅读(120)  评论(0)    收藏  举报