leetcode 480 滑动窗口维护中位数

在这里插入图片描述

解法一:
这个题是很有趣的一个题,目标是维护中位数,所以需要两个堆的数据结构。最大堆存较小的那部分,最小堆存较大的那部分,堆顶的就是中位数。
这里有一个难点就是什么时候prune,以及什么时候维持平衡。重点是一定要始终让一个堆最大,否则prune会出很多问题,此处让最大堆始终比最小堆多一个,在添加和删除后直接维持一次平衡然后prune就行,但这个prune必须保证先prune最大堆,再prune最小堆。
主程序部分直接用双指针模板就好。

from heapq import *
from collections import defaultdict
class Solution:
    def medianSlidingWindow(self, nums: List[int], k: int) -> List[float]:
        # 总让最大堆的元素更多
        class M:
            def __init__(self, nums, k):
                self.delayed = defaultdict(int)
                self.maxheap = []
                self.minheap = []
                heapify(self.maxheap)
                heapify(self.minheap)

                # init
                for i in range(k): 
                    heappush(self.maxheap, -nums[i])

                # 让两边平衡
                for i in range(k // 2):
                    heappush(self.minheap, -heappop(self.maxheap))
                
                self.balance = len<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值