LeetCode 295. 数据流的中位数

Posted hlk09

tags:

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

中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。

例如,

[2,3,4] 的中位数是 3

[2,3] 的中位数是 (2 + 3) / 2 = 2.5

设计一个支持以下两种操作的数据结构:

  • void addNum(int num) - 从数据流中添加一个整数到数据结构中。
  • double findMedian() - 返回目前所有元素的中位数。

示例:

addNum(1)
addNum(2)
findMedian() -> 1.5
addNum(3) 
findMedian() -> 2

这个题太过巧妙,我是直接学习LeetCode英文版的解答的。在这个题中,使用了两个堆(优先队列)。其中,一个堆为大顶堆,一个堆为小型堆。大顶堆存数组左边的数据,小顶堆存数组右边的数据。那么,小顶堆堆顶和大顶堆对顶是唯一提供中位数的可能来源。

为了保持大顶堆和小顶堆的平衡,设定小顶堆比大顶堆最多存储多一个元素。

至于添加操作,首先是把添加元素放入大顶堆。再把大顶堆的最大元素转移到小顶堆。如果小顶堆比大顶堆大,再把小顶堆元素转移到大顶堆。

class MedianFinder {
    priority_queue<int> lo;                              // max heap
    priority_queue<int, vector<int>, greater<int>> hi;   // min heap

public:
    // Adds a number into the data structure.
    void addNum(int num)
    {
        lo.push(num);                                    // Add to max heap

        hi.push(lo.top());                               // balancing step
        lo.pop();

        if (lo.size() < hi.size()) {                     // maintain size property
            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;
    }
};

 

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

leetcode| 295. 数据流的中位数

Leetcode 295.数据流的中位数

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

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

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

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