如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。
数据范围:数据流中数个数满足 ,大小满足
进阶: 空间复杂度 , 时间复杂度
示例1
输入
[5,2,3,4,1,6,7,0,8]
返回值
"5.00 3.50 3.00 3.50 3.00 3.50 4.00 3.50 4.00"说明
数据流里面不断吐出的是5,2,3…,则得到的平均数分别为5,(5+2)/2,3...
示例2
输入
[1,1,1]
返回值
"1.00 1.00 1.00"
import heapq
class MedianFinder:
def __init__(self):
# 大顶堆,存储较小的一半元素
self.max_heap = []
# 小顶堆,存储较大的一半元素
self.min_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 get_median(self):
if len(self.max_heap) == len(self.min_heap):
return (-self.max_heap[0] + self.min_heap[0]) / 2.0
else:
return -self.max_heap[0]/1.0
def get_medians(nums):
finder = MedianFinder()
medians = []
for num in nums:
finder.insert(num)
medians.append(finder.get_median())
return medians
# 示例
nums = [5, 2, 3, 4, 1, 6, 7, 0, 8]
print(get_medians(nums))