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()