Leetcode刷题记录——剑指 Offer 41. 数据流中的中位数
程序员文章站
2024-02-13 14:08:52
...
我们将数据分开存储
用两个小根堆
一个存数据流偏小的半段
一个存数据流偏大的半段
如何实现呢
python中的heapq是默认的小根堆 也就是每次都弹出最小的元素
那么我们用它来存储偏大的半段 则我们每次都可以吐出偏大一段的最小值
要构造偏小、且能随时吐出自身中最大元素的半段
我们还是用另一个小根堆B代替 只不过在记录数据的时候有一些技巧
我们在每次录入时进行检查
如果小根堆A和大跟堆B长度相等
则我们将元素先取相反数然后录入B
然后再将它吐出后取反录入A
如果二者长度不等
我们先将元素录入A
然后从A中吐出一个取反后录入B
这样 我们永远保证A中元素个数不小于B中元素个数
from heapq import *
class MedianFinder:
def __init__(self):
self.A = [] # 小顶堆,保存较大的一半
self.B = [] # 大顶堆,保存较小的一半
def addNum(self, num: int) -> None:
if len(self.A) == len(self.B):
heappush(self.B,-num)
heappush(self.A,-heappop(self.B))
else:
heappush(self.A,num)
heappush(self.B,-heappop(self.A))
def findMedian(self):
return self.A[0] if len(self.A) != len(self.B) else (self.A[0]-self.B[0])/2
上一篇: em px的关系
下一篇: Yii2 assets清除缓存的方法
推荐阅读
-
Leetcode刷题记录——剑指 Offer 41. 数据流中的中位数
-
python--剑指offer--困难--41. 数据流中的中位数
-
[leetCode]剑指 Offer 41. 数据流中的中位数
-
(python version) 剑指 offer 41. 数据流中的中位数
-
Leetcode 剑指 Offer 41. 数据流中的中位数
-
【剑指 Offer 】41. 数据流中的中位数
-
LeetCode 剑指 Offer 41. 数据流中的中位数—— JavaScript
-
《剑指offer》刷题笔记(树):数据流中的中位数
-
DHU高级程序设计-leetcode刷题剑指 Offer 57 - II. 和为s的连续正数序列
-
《剑指Offer》Java刷题 NO.40 数组中只出现一次的数字(数组、HashMap、位运算、异或)