侧边栏壁纸
博主头像
Hope博主等级

努力赚钱的工科研究生

  • 累计撰写 362 篇文章
  • 累计创建 129 个标签
  • 累计收到 5 条评论
标签搜索

剑指 Offer 41. 数据流中的中位数

Hope
2022-04-08 / 0 评论 / 0 点赞 / 296 阅读 / 826 字
温馨提示:
本文最后更新于 2022-04-08,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

剑指 Offer 41. 数据流中的中位数

思路:

对顶堆数据结构,up是小根堆,down是大根堆,维持数组数据向上是递增的。且down的元素与up的元素相等或者大于1。

对于要插入的元素,如果down是空的,或者当前元素小于down中最大的数,则插入到down中。

image.png

如果元素个数是奇数个则答案是down的top,否则是(down.top() + up.top() ) / 2.0。

代码:

class MedianFinder {
public:
    MedianFinder() {

    }
    
    void addNum(int num) {
        flag = !flag;
        if(down.empty() || num <= down.top()){
            down.push(num);
            if(down.size() > up.size() + 1){
                up.push(down.top());
                down.pop();
            }
        }
        else{
            up.push(num);
            if(up.size() > down.size()){
                down.push(up.top());
                up.pop();
            }
        }
    }
    
    double findMedian() {
        if(flag) return down.top();
        return (down.top() + up.top() ) / 2.0;
    }
    priority_queue<int,vector<int>,greater<int>> up;
    priority_queue<int,vector<int>,less<int>> down;
    bool flag = false;

};

/**
 * Your MedianFinder object will be instantiated and called as such:
 * MedianFinder* obj = new MedianFinder();
 * obj->addNum(num);
 * double param_2 = obj->findMedian();
 */
0

评论区