码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode 295. 数据流的中位数

时间:2018-10-05 18:50:33      阅读:273      评论:0      收藏:0      [点我收藏+]

标签:max   存储   data   中位数   vector   current   top   number   返回   

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

例如,

[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. 数据流的中位数

标签:max   存储   data   中位数   vector   current   top   number   返回   

原文地址:https://www.cnblogs.com/hlk09/p/9745268.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!