[不一样的剑指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;
    }
};

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

发布了4 篇原创文章 · 获赞 2 · 访问量 4951

猜你喜欢

转载自blog.csdn.net/supengufo/article/details/104907865