import heapq
class MedianFinder:
def __init__(self):
""" 初始化两个堆 """
self.left_heap = [] # 最大堆(存负数,模拟最大堆)
self.right_heap = [] # 最小堆
def addNum(self, num: int) -> None:
""" 插入数据,保持两个堆平衡 """
# 先将 num 插入到最大堆(存负数)
heapq.heappush(self.left_heap, -num)
# 维持 left_heap 的最大值 ≤ right_heap 的最小值
if self.left_heap and self.right_heap and (-self.left_heap[0] > self.right_heap[0]):
heapq.heappush(self.right_heap, -heapq.heappop(self.left_heap))
# 维持 left_heap 的大小不超过 right_heap + 1
if len(self.left_heap) > len(self.right_heap) + 1:
heapq.heappush(self.right_heap, -heapq.heappop(self.left_heap))
elif len(self.right_heap) > len(self.left_heap):
heapq.heappush(self.left_heap, -heapq.heappop(self.right_heap))
def findMedian(self) -> float:
""" 获取当前数据流的中位数 """
if len(self.left_heap) > len(self.right_heap):
return -self.left_heap[0] # 最大堆堆顶
return (-self.left_heap[0] + self.right_heap[0]) / 2.0 # 两堆堆顶的平均值
# Your MedianFinder object will be instantiated and called as such:
# obj = MedianFinder()
# obj.addNum(num)
# param_2 = obj.findMedian()
python-leetcode-数据流的中位数
最新推荐文章于 2025-04-03 14:22:40 发布