当前位置: 首页 > 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小的

相关文章:

  • 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
  • 赌博游戏网站怎么自己做/网络广告网站
  • 做网站 广州/最吸引人的引流话术
  • 做网站的登陆功能/免费刷赞网站推广qq免费
  • 网站建设用什么框架好/常州网站推广公司
  • 龙岗网站 建设深圳信科/平面设计培训费用一般是多少
  • 毕业设计论文网站/成品网站货源1