295. Find Median from Data Stream

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.
from heapq import heappop, heappush 

class MedianFinder: 
    def __init__(self): 
        """ 
        initialize your data structure here. 
        """ 
        self._low =  [] # maxheap, allow to have one extra element
        self._high = [] # minheap 
        self._median = None
    
    def low_to_high(self):
        heappush(self._high, -heappop(self._low))

    def high_to_low(self):
        heappush(self._low, -heappop(self._high))

    def balance(self):
        if (len(self._low) > len(self._high) + 1):
            self.low_to_high()
        elif len(self._high) > len(self._low):
            self.high_to_low()

    def addNum(self, num: int) -> None: 
        heappush(self._low, -num)
        if len(self._high) > 0 and -self._low[0] > self._high[0]: 
            self.low_to_high()
        self.balance()

    def findMedian(self) -> float: 
        if len(self._low) > len(self._high): 
            return -self._low[0] 
        else: 
            return (-self._low[0] + self._high[0]) / 2