这道题需要用一个最大堆和最小堆维护数组,满足最大堆的值<=最小堆的值,且最大堆数量 = 最小堆数量/最小堆数量+1。这样就能直接利用最大堆和最小堆顶部的数字得到中位数。
添加时:
1. 如果最大堆数量 = 最小堆数量,则应该增加最大堆数量
case 1. 添加的元素<=最大堆顶部元素,可以直接添加入最大堆
case 2. 添加的元素>最大堆顶部元素,需要将其添加入最小堆,并将最小堆pop出一个元素移到最大堆
2.如果最大堆数量 = 最小堆数量 + 1,则应该增加最小堆数量
case 1. 添加的元素>=最大堆顶部元素,可以直接添加入最小堆
case 2. 添加的元素<最大堆顶部元素,需要将其添加入最大堆,并将最大堆pop出一个元素移到最小堆
from Queue import PriorityQueue as PQ
class MedianFinder(object):
# 查看pq最顶端的元素
def top(self, pq):
temp = pq.get()
pq.put(temp)
return temp
def __init__(self):
"""
initialize your data structure here.
"""
# 保证maxQueue数量在[minQueue, minQueue+1]之间
self.maxQueue = PQ()
self.minQueue = PQ()
def addNum(self, num):
"""
:type num: int
:rtype: None
"""
if self.maxQueue.qsize() == self.minQueue.qsize():
if self.maxQueue.qsize() == 0 or num <= self.top(self.maxQueue):
self.maxQueue.put(-num)
else:
self.minQueue.put(num)
temp = self.minQueue.get()
self.maxQueue.put(-temp)
else:
if num >= -self.top(self.maxQueue):
self.minQueue.put(num)
else:
self.maxQueue.put(-num)
temp = self.maxQueue.get()
self.minQueue.put(-temp)
def findMedian(self):
"""
:rtype: float
"""
if self.maxQueue.qsize() != self.minQueue.qsize():
temp = self.maxQueue.get()
self.maxQueue.put(temp)
return -temp
else:
temp1 = self.maxQueue.get()
self.maxQueue.put(temp1)
temp2 = self.minQueue.get()
self.minQueue.put(temp2)
return (-temp1 + temp2) / 2.0
# Your MedianFinder object will be instantiated and called as such:
# obj = MedianFinder()
# obj.addNum(num)
# param_2 = obj.findMedian()