python 使用堆求中位数的代码
时间: 2023-11-12 13:11:51 浏览: 80
以下是使用堆求中位数的 Python 代码:
```python
import heapq
class MedianFinder:
def __init__(self):
"""
initialize your data structure here.
"""
self.min_heap = []
self.max_heap = []
def addNum(self, num: int) -> None:
heapq.heappush(self.max_heap, -heapq.heappushpop(self.min_heap, num))
if len(self.max_heap) > len(self.min_heap):
heapq.heappush(self.min_heap, -heapq.heappop(self.max_heap))
def findMedian(self) -> float:
if len(self.min_heap) > len(self.max_heap):
return float(self.min_heap[0])
else:
return (self.min_heap[0] - self.max_heap[0]) / 2.0
```
首先我们创建两个堆,一个小根堆 `min_heap` 和一个大根堆 `max_heap`。`min_heap` 用于存放较大的一半数字,`max_heap` 用于存放较小的一半数字。
当我们需要添加一个新数字时,我们首先将它加到 `min_heap` 中。然后将 `min_heap` 中的最小数字(也就是中位数右边的第一个数字)弹出,并将其加入 `max_heap` 中。这样就保证了 `max_heap` 中的数字都小于等于 `min_heap` 中的数字。如果此时 `max_heap` 的长度比 `min_heap` 的长度大了 1,为了保持平衡,我们就将 `max_heap` 中的最大数字弹出,并将其加入 `min_heap` 中。
当需要求中位数时,我们只需要判断 `min_heap` 和 `max_heap` 的长度,如果 `min_heap` 的长度比 `max_heap` 大,那么中位数就是 `min_heap` 的最小数字。否则,我们将 `min_heap` 的最小数字和 `max_heap` 的最大数字相加,并除以 2,即可得到中位数。
需要注意的是,如果 `min_heap` 或 `max_heap` 为空,那么我们不能直接访问他们的最小或最大数字,需要先进行判断。
阅读全文