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

LeetCode 239. 滑动窗口最大值(单调队列)

 题目传送门:239. 滑动窗口最大值 - 力扣(LeetCode)

题意就是求每个窗口内的最大值,返回一个最大值的数组,滑动窗口的最值问题。

做法:维护一个单调递减队列,队头为当前窗口的最大值。

设计的单调队列在入队、出队操作时满足如下规则:

  • 入队:新元素入队前,如果队尾元素大于要插入的新元素,那么就出队。就这样移除掉所有比插入的元素小的值。
  • 出队:检查队头元素是否超出窗口范围(下标 <= i - k),若超出则移除。

每次窗口形成后,队头元素即位窗口的最大值。

注:

  • 存储下标而非值,便于判断元素是否过期(该元素是否还在窗口中,窗口移动时需移除左边元素,i - k即为当前窗口的最左边元素下标)。
  • 结果数组长度 = 窗口滑动次数 = n - k + 1。n - k理解为减去刚开始的窗口元素还有n-k的元素需要进窗口,然后再加上第一次的窗口(没移动,也可以理解为窗口刚移动到数组)。
class Solution {public int[] maxSlidingWindow(int[] nums, int k) {if (nums == null || nums.length < k || k <= 0) {return new int[0];}int n = nums.length;int[] res = new int[n - k + 1];Deque<Integer> q = new ArrayDeque<>();for (int i = 0; i < n; i++) {while (!q.isEmpty() && q.peekFirst() <= i - k) {q.pollFirst();}while (!q.isEmpty() && nums[q.peekLast()] < nums[i]) {q.pollLast();}q.offerLast(i);if (i >= k - 1) {res[i - k + 1] = nums[q.peekFirst()];}}return res;}
}

 以 nums = [1,3,-1,-3,5], k=3 为例,算法的执行流程为:

当前元素窗口单调递减队列(下标)最大值操作说明
i = 0 nums[0] = 1[1][0]-初始入队
i = 1 nums[1] = 3[1, 3][1]-移除0(1 < 3),1入队
i = 2 nums[2] = -1[1, 3, -1][1, 2]32入队,记录队头nums[1] = 3
i = 3 nums[3] = -3[3, -1, -3][1, 2, 3]33入队,队头未过期
i = 4 nums[4] = 5[-1, -3, 5][4]5移除比5小的

http://www.lqws.cn/news/198127.html

相关文章:

  • 高保真组件库:数字输入框
  • Redis:过期删除策略与内存淘汰策略的解析指南
  • 【计算机网络】Linux下简单的TCP服务器(超详细)
  • 轻量级Docker管理工具Docker Switchboard
  • vue中的派发事件与广播事件,及广播事件应用于哪些场景和一个表单验证例子
  • iview框架主题色的应用
  • csrf攻击学习
  • 动端React表格组件:支持合并
  • Linux下VSCode开发环境配置(LSP)
  • GOOUUU ESP32-S3-CAM 果云科技开发板开发指南(一)(超详细!)Vscode+espidf 通过摄像头拍摄照片并存取到SD卡中,文末附源码
  • Mybatis 拦截器 与 PageHelper 源码解析
  • AI Agent 架构设计:ReAct 与 Self-Ask 模式对比与分析
  • Cisco Packer Tracer 综合实验
  • QuickJS 如何发送一封邮件 ?
  • 【LLM-Agent】智能体的记忆缓存设计
  • 浅谈 React Hooks
  • ​React Hooks 的闭包陷阱问题
  • python学习打卡day47
  • 从0开始学习R语言--Day19--连续变量的相关性检验
  • 数 据 结 构 进 阶:哨 兵 位 的 头 结 点 如 何 简 化 链 表 操 作
  • 管道与进程间通信
  • 如何处理双面沉金线路板上的定位孔?
  • 实现简易动效
  • 【CSS-5】掌握CSS文本样式:从基础到高级技巧
  • MS358A 低功耗运算放大器 车规
  • Linux与Windows切换使用Obsidian,出现 unexplained changes 问题的解决
  • 阿里云ACP云计算备考笔记 (4)——企业应用服务
  • NLP学习路线图(三十):微调策略
  • 【小红书拥抱开源】小红书开源大规模混合专家模型——dots.llm1
  • 如何从浏览器中导出网站证书