python-leetcode-数据流的中位数

295. 数据流的中位数 - 力扣(LeetCode)

import heapq
class MedianFinder:

    def __init__(self):
        """ 初始化两个堆 """
        self.left_heap = []  # 最大堆(存负数,模拟最大堆)
        self.right_heap = []  # 最小堆

    def addNum(self, num: int) -> None:
        """ 插入数据,保持两个堆平衡 """
        # 先将 num 插入到最大堆(存负数)
        heapq.heappush(self.left_heap, -num)

        # 维持 left_heap 的最大值 ≤ right_heap 的最小值
        if self.left_heap and self.right_heap and (-self.left_heap[0] > self.right_heap[0]):
            heapq.heappush(self.right_heap, -heapq.heappop(self.left_heap))

        # 维持 left_heap 的大小不超过 right_heap + 1
        if len(self.left_heap) > len(self.right_heap) + 1:
            heapq.heappush(self.right_heap, -heapq.heappop(self.left_heap))
        elif len(self.right_heap) > len(self.left_heap):
            heapq.heappush(self.left_heap, -heapq.heappop(self.right_heap))

    def findMedian(self) -> float:
        """ 获取当前数据流的中位数 """
        if len(self.left_heap) > len(self.right_heap):
            return -self.left_heap[0]  # 最大堆堆顶
        return (-self.left_heap[0] + self.right_heap[0]) / 2.0  # 两堆堆顶的平均值


# Your MedianFinder object will be instantiated and called as such:
# obj = MedianFinder()
# obj.addNum(num)
# param_2 = obj.findMedian()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值