当前位置: 首页 > news >正文

Python | Leetcode Python题解之第480题滑动窗口中位数

题目:

题解:

class DualHeap:def __init__(self, k: int):# 大根堆,维护较小的一半元素,注意 python 没有大根堆,需要将所有元素取相反数并使用小根堆self.small = list()# 小根堆,维护较大的一半元素self.large = list()# 哈希表,记录「延迟删除」的元素,key 为元素,value 为需要删除的次数self.delayed = collections.Counter()self.k = k# small 和 large 当前包含的元素个数,需要扣除被「延迟删除」的元素self.smallSize = 0self.largeSize = 0# 不断地弹出 heap 的堆顶元素,并且更新哈希表def prune(self, heap: List[int]):while heap:num = heap[0]if heap is self.small:num = -numif num in self.delayed:self.delayed[num] -= 1if self.delayed[num] == 0:self.delayed.pop(num)heapq.heappop(heap)else:break# 调整 small 和 large 中的元素个数,使得二者的元素个数满足要求def makeBalance(self):if self.smallSize > self.largeSize + 1:# small 比 large 元素多 2 个heapq.heappush(self.large, -self.small[0])heapq.heappop(self.small)self.smallSize -= 1self.largeSize += 1# small 堆顶元素被移除,需要进行 pruneself.prune(self.small)elif self.smallSize < self.largeSize:# large 比 small 元素多 1 个heapq.heappush(self.small, -self.large[0])heapq.heappop(self.large)self.smallSize += 1self.largeSize -= 1# large 堆顶元素被移除,需要进行 pruneself.prune(self.large)def insert(self, num: int):if not self.small or num <= -self.small[0]:heapq.heappush(self.small, -num)self.smallSize += 1else:heapq.heappush(self.large, num)self.largeSize += 1self.makeBalance()def erase(self, num: int):self.delayed[num] += 1if num <= -self.small[0]:self.smallSize -= 1if num == -self.small[0]:self.prune(self.small)else:self.largeSize -= 1if num == self.large[0]:self.prune(self.large)self.makeBalance()def getMedian(self) -> float:return float(-self.small[0]) if self.k % 2 == 1 else (-self.small[0] + self.large[0]) / 2class Solution:def medianSlidingWindow(self, nums: List[int], k: int) -> List[float]:dh = DualHeap(k)for num in nums[:k]:dh.insert(num)ans = [dh.getMedian()]for i in range(k, len(nums)):dh.insert(nums[i])dh.erase(nums[i - k])ans.append(dh.getMedian())return ans

http://www.mrgr.cn/news/50289.html

相关文章:

  • UG(交互式CAD/CAM系统)-WINDOWS 11安装教程
  • 023 elasticsearch查询数据 高亮 分页 中文分词器 field的数据类型
  • 多模态大模型 + 数字人 实现半自动 演示文稿 PPT讲解 搭建赛博老师傅 助力程序员赛博飞升!!!
  • Java | Leetcode Java题解之第479题最大回文数乘积
  • SpringCloud学习记录|day5
  • torch.jit.script编译加速推理的尝试
  • 读书笔记《PPT演讲力》大树模型
  • 如何优化 Nginx 配置
  • 用Java写一个学生类
  • RA6M5——GPIO
  • React前端框架的描述和使用方法
  • Java开发中知识点整理
  • P1439 【模板】最长公共子序列 Python 题解
  • Redis如何批量删除指定前缀的key
  • 单点登录Apereo CAS 7.1客户端登出配置及免认证页面问题
  • 安装和配置Canal
  • Linux rm命令详解
  • 面对服务器掉包的时刻困扰,如何更好的解决
  • Oracle数据库安装Windows版本
  • C++ 内存分布情况