[不一样的剑指offer] 面试题41. 数据流中的中位数

数据流中的中位数

本博客所有出现的 [不一样的剑指offer] 系列,个人认为都比书上的题解更好理解。

概括:书上的题目在实现两个数据结构的平衡的地方写的有点啰嗦。这里分别有两种方法实现,要简单很多。

1 优先级队列

class MedianFinder {
    priority_queue<int> lo;                              // 大顶堆 左半边 从大到小 大的先出
    //priority_queue<int, vector<int>, less<int> > lo; //相当于这样写
    priority_queue<int, vector<int>, greater<int>> hi;   // 小顶堆

public:
    // Adds a number into the data structure.
    void addNum(int num) {
        lo.push(num);                                    // 加到大顶堆

        hi.push(lo.top());                               // 平衡

        lo.pop();

        if (lo.size() < hi.size()) {                     // 维护两个堆元素个数
            lo.push(hi.top());
            hi.pop();
        }
    }

    // Returns the median of current data stream
    double findMedian() {
        return lo.size() > hi.size() ? (double) lo.top() : (lo.top() + hi.top())*0.5;
    }
};

2 multiset

class MedianFinder2 {
public:
    /** initialize your data structure here. */
    multiset<int, less<>> min_set;//最小值放前面 对应排序数组的右半边
    multiset<int, greater<>> max_set;//最大值放前面,对应排序数组的左半边
    MedianFinder2() {
    }
    void addNum(int num) {
        max_set.insert(num);
        min_set.insert(*max_set.begin());
        max_set.erase(max_set.find(*max_set.begin()));
        if(max_set.size()<min_set.size()){
            max_set.insert(*min_set.begin());
            min_set.erase(min_set.find(*min_set.begin()));
        }
    }
    double findMedian() {
        return max_set.size()>min_set.size()?*max_set.begin(): (double(*min_set.begin())+double(*max_set.begin()))/2;
    }
};

个人见解,欢迎讨论指教!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值