# -*- coding:utf-8 -*-
import heapq
class Solution:
def __init__(self):
# 最小堆,保存较大的一半元素
self.min_heap = []
# 最大堆,保存较小的一半元素,最大堆使用负数存储
self.max_heap = []
def Insert(self, num):
# 插入时首先考虑插入到最大堆(保存较小一半的元素)
if not self.max_heap or num <= -self.max_heap[0]:
heapq.heappush(self.max_heap, -num)
else:
heapq.heappush(self.min_heap, num)
# 保持两个堆的平衡
if len(self.max_heap) > len(self.min_heap) + 1:
# 如果最大堆比最小堆多两个以上元素,将堆顶元素移动到最小堆
heapq.heappush(self.min_heap, -heapq.heappop(self.max_heap))
elif len(self.min_heap) > len(self.max_heap):
# 如果最小堆比最大堆多,移动堆顶元素到最大堆
heapq.heappush(self.max_heap, -heapq.heappop(self.min_heap))
def GetMedian(self):
# 如果两个堆大小相等,中位数为两个堆顶元素的平均值
if len(self.max_heap) == len(self.min_heap):
return (-self.max_heap[0] + self.min_heap[0]) / 2
else:
# 否则,中位数为元素较多的那个堆的堆顶元素
return -self.max_heap[0]