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

单调队列-解定长滑窗的最值问题 ( leetcode 239)

引言

碎碎念,找了很多关于单调队列的说明,但是感觉都不是很本质且直击要害,很多都是在讲算法过程本身,这里贴一下算法思想和代码实现。

leetcode 239 求定长滑动窗口的最大值链接

核心思想为定义并维护下面的循环不变式:

每次循环开始前,队列中的元素为【上一个窗口】的所有元素中大于等于窗口右端点元素值的元素按照降序排列得到的序列的一个【非空子序列】,并规定除了最大值元素和右端点元素外,中间元素允许缺失!

代码,参考了链接

classSolution:defmaxSlidingWindow(self,nums:List[int],k:int)->List[int]:ans=[0]*(len(nums)-k+1)# 窗口个数q=deque()# 双端队列# 核心循环不变式:每次循环开始前,队列中的元素为【上一个窗口】的所有元素中,# 大于等于窗口右端点元素值的元素按照降序排列得到的序列的一个【非空子序列】,# 并规定除了最大值元素和右端点元素外,中间元素允许缺失!(这个是针对第一个窗口的补丁)fori,xinenumerate(nums):# 计算当前滑窗的左端点left=i-k+1# 下面的1,2操作维护当前轮窗口的循环不变式# 1.左边出# 判断上一个窗口的最大值元素是否恰好为上一个窗口的左边界元素:# 如果是,则需要从当前窗口移出,因为窗口整体右移了1位 (注意只有i >=k 才有移出左边界的操作)# 如果不是,不需要进行任何操作ifi>=kandq[0]==left-1:q.popleft()# 2. 右边入,将破坏当前轮循环不变式的元素pop出# 然后再加入当前元素的下标whileqandnums[q[-1]]<=x:q.pop()q.append(i)# 注意保存的是下标# 3. 记录答案ifleft>=0:# 由于队首到队尾单调递减,所以窗口最大值就在队首ans[left]=nums[q[0]]returnans

启发,部分重叠问题都可以从维护循环不变式的角度进行思考构建算法。

http://www.jsqmd.com/news/1181162/

相关文章:

  • chocofi社区资源汇总:从入门到精通的所有资源
  • C盘里哪些缓存能放心删,哪些又必须留着?三个判断标准讲清楚
  • 如何免费解锁Wand专业版:开源增强工具完整指南
  • SAP 诞生与发展历程完整分析总结一、诞生背景与初创期(1972–1981:R/1 时代,集成实时财务软件雏形)1. 创立起源1972 年 4 月 1 日,5 名 IBM 德国资深工程师(Has
  • ZenDNN与TorchAO协同优化:amd/gpt-oss-20b模型CPU推理效率提升秘籍
  • 如何快速上手Phi-4-mini-instruct_rai_1.7.1_npu_4K:5分钟完成AMD NPU部署
  • Transformer架构精讲 —— 从零构建编码器与解码器
  • 【企业级公众号内容生产SOP】:ChatGPT+人工校验双引擎工作法,已落地87家品牌,平均提效210%
  • 如何彻底解锁Wand专业版功能:开源增强工具终极指南
  • nestos-assembler高级技巧:构建缓存优化与发布件管理最佳实践
  • UE4 VR角色控制实战:从零构建SteamVR适配的Pawn框架
  • 5分钟掌握Wand-Enhancer:WeMod终极增强工具完整指南
  • OpenIO SDS故障排除:常见问题与解决方案完全手册
  • 从历史演变到现代实践:解读Linux中/bin、/sbin、/usr/bin、/usr/sbin、/usr/local/bin、/usr/local/sbin的布局逻辑
  • 【ChatGPT数据分析黄金法则】:20年数据科学家亲授7个不外传的Prompt工程+清洗+可视化实战技巧
  • StockGPT:解码百年股价序列,生成式AI如何重塑量化投资范式
  • 基于ICM-42605和PIC18F2553的6DoF运动追踪系统设计与实现
  • GPT-5.6 值得用吗?普通用户三大维度实测与选型攻略
  • 打卡信奥刷题(3442)用C++实现信奥题 P10388 [蓝桥杯 2024 省 A] 团建
  • 从自相关函数看噪声本质:平稳与非平稳噪声的实战识别与处理
  • Wand-Enhancer终极指南:5分钟免费解锁WeMod专业版功能
  • 数据集扩充增广(分割标签同步) 适用于yolov5到v12的分割数据集和obb数据集,支持同步更新标签(txt) 使用labelme标注的多边形数据集,支持同步更新 (1)
  • 大模型提示词工程深度解析:从原理到最佳实践
  • 桌面图标和文件全部消失如何找回?从显示设置排查到注册表修复的完整步骤
  • 边缘推理算子级融合策略实战:Conv+BN+ReLU 三合一在 ARM NEON 上的手写实现与性能分析
  • openEuler Intel内核:如何为下一代Intel平台构建强大的操作系统基础
  • CTF-SHOW 题解(更新中)
  • Expo社交登录终极解密:如何用一行代码统一16个平台的用户认证
  • 时光回溯:用Python重建你的QQ空间数字记忆档案
  • 免费开源音频转换神器:fre:ac完整使用指南