LeetCode 295 数据流的中位数[队列] HERODING的LeetCode之路

Posted HERODING23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 295 数据流的中位数[队列] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。


解题思路:
解题的关键在于维护两个队列,即最小堆和最大堆,最小堆保存大于中位数的数列,最大堆保存小于中位数的队列,保证最小堆和最大堆的长度差不超过2,谁超谁第一个元素就要移到对方,找中位数的时候,如果长度为偶数,那么返回两个堆头的平均值,如果长度为奇数,返回最小堆的头(最小堆允许比最大堆大1),代码如下:

class MedianFinder {
public:
    // 小于中位数的数列(从大往小)
    priority_queue<int, vector<int>, less<int>> queMin;
    // 大于中位数的数列(从小往大)
    priority_queue<int, vector<int>, greater<int>> queMax;

    MedianFinder() {}

    void addNum(int num) {
        // 小于中位数或者为初始值
        if (queMin.empty() || num <= queMin.top()) {
            queMin.push(num);
            // 长度差为2
            if (queMax.size() + 1 < queMin.size()) {
                queMax.push(queMin.top());
                queMin.pop();
            }
        } else {// 大于中位数
            queMax.push(num);
            // 大于中位数的序列长了
            if (queMax.size() > queMin.size()) {
                queMin.push(queMax.top());
                queMax.pop();
            }
        }
    }

    double findMedian() {
        // 序列长度为奇数
        if (queMin.size() > queMax.size()) {
            return queMin.top();
        }
        // 序列长度为偶数
        return (queMin.top() + queMax.top()) / 2.0;
    }
};


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

以上是关于LeetCode 295 数据流的中位数[队列] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 295. 数据流的中位数

leetcode| 295. 数据流的中位数

Leetcode 295.数据流的中位数

python-leetcode295-双堆数据流的中位数

Leetcode刷题Python295. 数据流的中位数

Leetcode刷题Python295. 数据流的中位数