295. 数据流的中位数
作者:互联网
使用大根堆和小根, PriorityQueue默认是小根堆,所以存入负数让其变成大根堆.
from queue import PriorityQueue
class MedianFinder:
def __init__(self):
"""
initialize your data structure here.
"""
self.hi = PriorityQueue() # 小根堆
self.lo = PriorityQueue() # 大根堆
def addNum(self, num: int) -> None:
self.lo.put(-num)
self.hi.put(-self.lo.get())
if self.hi.qsize() > self.lo.qsize() + 1:
self.lo.put(-self.hi.get())
def findMedian(self) -> float:
if (self.hi.qsize() + self.lo.qsize()) % 2 != 0:
return self.hi.queue[0]
else:
return (self.hi.queue[0] - self.lo.queue[0]) / 2
放置期间, 始终保持
- 大根堆数量不小于小根堆数量
- 数量之差不超过1.
- 要保持小根堆的最小值>=大根堆的最大值.
以下操作能保证每次添加时, 小根堆数量+1, 大根堆数量不变, 且维持特性3
self.lo.put(-num)
self.hi.put(-self.lo.get())
以下操作维持特性2:
if self.hi.qsize() > self.lo.qsize() + 1:
self.lo.put(-self.hi.get())
也可以用另一种思路《风险对冲》对顶堆求中位数去做.
标签:大根堆,qsize,lo,self,中位数,put,hi,数据流,295 来源: https://blog.csdn.net/duoyasong5907/article/details/113719849