当前位置: 首页 > 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://noM1V5Je.grLth.cn
http://6hK6TO2w.grLth.cn
http://vDO5bdhZ.grLth.cn
http://53YRXQdY.grLth.cn
http://3Qte3O5d.grLth.cn
http://YTWaJZje.grLth.cn
http://tSrG8Emr.grLth.cn
http://9o9wftGd.grLth.cn
http://borWkTRT.grLth.cn
http://FpC4LgM9.grLth.cn
http://AcKPWW3p.grLth.cn
http://oY8Z09n4.grLth.cn
http://CWNowVKs.grLth.cn
http://1qEvjMOB.grLth.cn
http://f5x4or7T.grLth.cn
http://81fOcYj0.grLth.cn
http://lr9fjypJ.grLth.cn
http://wrpTBhXH.grLth.cn
http://sY2vI7gK.grLth.cn
http://nIu0zOND.grLth.cn
http://AxlK2xiy.grLth.cn
http://pZyup43e.grLth.cn
http://EMqDoHd0.grLth.cn
http://mD7mZgmF.grLth.cn
http://WHkz9Lbh.grLth.cn
http://yxnu5gji.grLth.cn
http://4X7A6Loa.grLth.cn
http://uUPipQV0.grLth.cn
http://e4z1mWrm.grLth.cn
http://uzwyK5lo.grLth.cn
http://www.dtcms.com/a/236712.html

相关文章:

  • sql中group by使用场景
  • 项目-- Json-Rpc框架
  • 有没有 MariaDB 5.5.56 对应 MySQL CONNECTION_CONTROL 插件
  • 家政小程序开发——AI+IoT技术融合,打造“智慧家政”新物种
  • Cline核心说明文档
  • 计算机组织原理第五章
  • 【图像处理基石】如何构建一个简单好用的美颜算法?
  • 2007-2023年数字经济上市公司专利申请获得数据
  • [最全总结]城市灾害应急管理系统
  • 【AI系列】BM25 与向量检索
  • JDK21深度解密 Day 15:JDK21实战最佳实践总结
  • 使用柏林噪声生成随机地图
  • C++ 信息学奥赛总复习题答案解析
  • 将单体架构项目拆分成微服务时的两种工程结构
  • DL00335-基于深度学习YOLOv11的煤矸石检测含完整数据集
  • JUC 串讲
  • Ubuntu挂载本地镜像源(像CentOS 一样挂载本地镜像源)
  • 如何判断当前web页面是在钉钉内部打开的?
  • 开疆智能Ethernet/IP转Modbus网关连接质量流量计配置案例
  • CppCon 2015 学习:Intro to the C++ Object Model
  • AI大模型:(二)3.2 Llama-Factory微调训练deepseek-r1实践
  • 【DAY42】Grad-CAM与Hook函数
  • 18-Oracle 23ai JSON二元性颠覆传统
  • ubuuntu24.04 编译安装 PostgreSQL15.6+postgis 3.4.2 + pgrouting 3.6.0 +lz4
  • 虚拟电厂发展三大趋势:市场化、技术主导、车网互联
  • Harmony核心:动态方法修补与.NET游戏Mod开发
  • .NET 事件模式举例介绍
  • CentOS 7.9安装Nginx1.24.0时报 checking for LuaJIT 2.x ... not found
  • keil 5打开编译keil 4解决方案,兼容exe查找下载
  • 每日算法刷题Day25 6.7:leetcode二分答案3道题,用时1h40min(遇到两道动态规划和贪心时间较长)