题目
设计一个支持以下两种操作的数据结构:
void addNum(int num)
- 从数据流中添加一个整数到数据结构中。double findMedian()
- 返回目前所有元素的中位数。
示例:
addNum(1)
addNum(2)
findMedian() -> 1.5
addNum(3)
findMedian() -> 2
方案一(两个堆)**
class MedianFinder:
def __init__(self):
"""
initialize your data structure here.
1. lo 为大顶堆
2. hi 为小顶堆
每个堆各保持一半的元素,如果元素总数为奇数个,则放入大顶堆
"""
self.hi = []
self.lo = []
def addNum(self, num: int) -> None:
# 注意调整堆的平衡
heapq.heappush(self.lo, num)
heapq.heappush(self.hi, -heapq.heappop(self.lo))
if len(self.lo) < len(self.hi):
heapq.heappush(self.lo, -heapq.heappop(self.hi))
def findMedian(self) -> float:
if (len(self.hi) + len(self.lo)) % 2 == 1:
return self.lo[0]
else:
return (self.lo[0] - self.hi[0]) / 2
原文
https://leetcode-cn.com/explore/interview/card/2020-top-interview-questions/291/design/1303/
https://leetcode-cn.com/problems/find-median-from-data-stream/solution/shu-ju-liu-de-zhong-wei-shu-by-leetcode/