Find Median from Data Stream

双堆集双堆集,一直记录当前为偶数次还是奇数次就能解决了,另外往建maxheap就把数乘负一就行了,这是此题的第一个小技巧,第二个就是一开始先往两个堆集里垫一个sys.maxint,可以避免处理边界情况了

class MedianFinder(object):

    def __init__(self):
        """
        initialize your data structure here.
        """
        self.maxHeap = [sys.maxint]
        self.minHeap = [sys.maxint]
        self.count = 0

    def addNum(self, num):
        """
        :type num: int
        :rtype: void
        """
        if self.count % 2 == 0 and -num <= self.maxHeap[0] and num <= self.minHeap[0]:
            heapq.heappush(self.maxHeap, -num)
        elif self.count % 2 == 0 and num > self.minHeap[0]:
            tmp = heapq.heappushpop(self.minHeap, num)
            heapq.heappush(self.maxHeap, -tmp)
        elif self.count % 2 == 0 and -num > self.maxHeap[0]:
            heapq.heappush(self.maxHeap, -num)
        elif self.count % 2 and -num <= self.maxHeap[0] and num <= self.minHeap[0]:
            heapq.heappush(self.minHeap, num)
        elif self.count % 2 and num > self.minHeap[0]:
            heapq.heappush(self.minHeap, num)
        else:
            tmp = heapq.heappushpop(self.maxHeap, -num)
            heapq.heappush(self.minHeap, -tmp)

        self.count += 1

    def findMedian(self):
        """
        :rtype: float
        """

        if self.count % 2:
            result = self.maxHeap[0]
            return -result
        else:
            result = -self.maxHeap[0] + self.minHeap[0]
            return result / 2.0


# Your MedianFinder object will be instantiated and called as such:
# obj = MedianFinder()
# obj.addNum(num)
# param_2 = obj.findMedian()

results matching ""

    No results matching ""