295. Find Median from Data Stream【H】【2.7】

原创 2016年06月02日 09:14:17

Median is the middle value in an ordered integer list. If the size of the list is even, there is no middle value. So the median is the mean of the two middle value.

Examples: 

[2,3,4] , the median is 3

[2,3], the median is (2 + 3) / 2 = 2.5

Design a data structure that supports the following two operations:

  • void addNum(int num) - Add a integer number from the data stream to the data structure.
  • double findMedian() - Return the median of all elements so far.

For example:

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

Credits:
Special thanks to @Louis1992 for adding this problem and creating all test cases.


Subscribe to see which companies asked this question

关键有两个,一个是使用最小堆

另一个是,算法上,把整个分成两部分,一个装较小的一半儿,一个装较大的一半儿





from heapq import *
class MedianFinder:
    def __init__(self):

        self.small = []
        self.large = []

        """
        Initialize your data structure here.
        """


    def addNum(self, num):

        s = self.small
        l = self.large

        if len(s) + len(l) < 2:
            if len(l) == 0:
                heappush(l,num)
            else:
                heappush(s,-heappushpop(l,num))
            return

        a = -heappop(s)
        b = heappop(l)

        maxx = max(a,max(b,num))
        minn = min(a,min(b,num))

        num = a + b + num - minn - maxx

        heappush(l,num)
        heappush(l,maxx)
        heappush(s,-minn)

        if len(s) < len(l) - 1:
            heappush(s, -heappop(l))


        """
        Adds a num into the data structure.
        :type num: int
        :rtype: void
        """


    def findMedian(self):


        s = self.small
        l = self.large
        if len(s) == len(l):
            return (l[0] - s[0]) / 2.0
        return l[0]/1.0

        """
        Returns the median of current data stream
        :rtype: float
        """


# Your MedianFinder object will be instantiated and called as such:
# mf = MedianFinder()
# mf.addNum(1)
# mf.findMedian()

295. Find Median from Data Stream&数据流中的中位数

题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。解答 ...
  • sjt091110317
  • sjt091110317
  • 2016年03月14日 09:25
  • 586

[leetcode-295]Find Median from Data Stream(java)

问题描述:这里写链接内容分析:这道题比较简单,重点在于如何高效插入数据。这里采用的是二分法,相当于插入排序。代码如下:class MedianFinder { List numlist = ...
  • zdavb
  • zdavb
  • 2015年10月19日 19:12
  • 612

[LeetCode] Find Median from Data Stream

Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...
  • u011331383
  • u011331383
  • 2015年11月04日 16:43
  • 1795

lintcode 1: Data Stream Median

lintcode 1: Data Stream Median python java c++
  • xudli
  • xudli
  • 2015年06月06日 15:51
  • 5463

[leetcode] 295. Find Median from Data Stream 解题报告

题目链接: https://leetcode.com/problems/find-median-from-data-stream/ Median is the middle value in an...
  • qq508618087
  • qq508618087
  • 2016年03月30日 14:18
  • 1310

LeetCode295——Find Median from Data Stream

LeetCode295——Find Median from Data Stream 前提是Ordered List。 但是插入即addNum操作可能是无序的。 尝试过对序列排序再返回的办法结果是...
  • zhangxiao93
  • zhangxiao93
  • 2015年10月20日 23:00
  • 697

[Leetcode]295. Find Median from Data Stream

Leetcode 295. Find Median from Data Stream
  • Yaokai_AssultMaster
  • Yaokai_AssultMaster
  • 2017年08月06日 07:26
  • 198

295. Find Median from Data Stream

Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...
  • qq_14924883
  • qq_14924883
  • 2016年01月04日 19:38
  • 97

[LeetCode]295. Find Median from Data Stream

https://leetcode.com/problems/find-median-from-data-stream/?tab=Description 找数据流中的中位数 大根...
  • gqk289
  • gqk289
  • 2017年03月06日 15:57
  • 84

Leetcode 295. Find Median from Data Stream

Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...
  • Hanwenwangad
  • Hanwenwangad
  • 2016年01月23日 06:00
  • 141
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:295. Find Median from Data Stream【H】【2.7】
举报原因:
原因补充:

(最多只允许输入30个字)