#295
Hard
堆 / 优先队列

Find Median from Data Stream

维护一个数据结构,支持每次插入后返回中位数。

HeapDesign

题目定位

中位数天然位于下半部分和上半部分之间,因此“大根堆 + 小根堆”是最标准的结构。

关键观察

一个堆维护较小的一半,一个堆维护较大的一半,两者大小差不能超过 1。

目标复杂度

O(log n) / O(n)

这题的解法思路怎么拆

1

中位数天然位于下半部分和上半部分之间,因此“大根堆 + 小根堆”是最标准的结构。

2

一个堆维护较小的一半,一个堆维护较大的一半,两者大小差不能超过 1。

3

先用一句话说明堆顶代表什么。

4

新候选者一旦合格就立刻入堆。

参考实现

Python
# Generic pattern template
import heapq

heap = []
heapq.heappush(heap, value)
smallest = heapq.heappop(heap)

# max heap in Python
heapq.heappush(heap, -value)
largest = -heapq.heappop(heap)

常见坑点

warning

插入后忘了重新平衡两个堆。

warning

元素个数为奇数时,没有统一约定哪边多一个。

高频追问

两个堆之间必须长期维持什么不变式?

为什么每次都整体排序不现实?

继续刷相关题

先把 堆 / 优先队列 这个模式刷成体系,再去做更难变体。

view_week回到模式页
LeetCode 295. Find Median from Data Stream 题解思路 | Interview AiBox