当前位置: 首页 > 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.xdnf.cn/news/916975.html

相关文章:

  • 【Hot 100】295. 数据流的中位数
  • 客户端和服务器已成功建立 TCP 连接【输出解析】
  • Doris 数据库深度解析:架构、原理与实战应用
  • 5.4.2 Spring Boot整合Redis
  • Cisco Packer Tracer 综合实验
  • 网页绘制表格
  • 8个AI软件介绍及其工作原理讲解
  • 基于功能基团的3D分子生成扩散模型 - D3FG 评测
  • Java编程中常见的条件链与继承陷阱
  • 60天python训练计划----day46 and day47
  • 比较数据迁移后MySQL数据库和ClickHouse数据仓库中的表
  • Faiss vs Milvus 深度对比:向量数据库技术选型指南
  • 在 Linux 中修改 Apache HTTP Server(httpd)默认端口的完整指南
  • 电路图识图基础知识-电动机制动控制电路(十八)
  • 【力扣】2434.使用机器人打印字典序最小的字符串
  • 计算机组成原理-总线
  • rabbit mq使用TTL和DLX实现延迟队列
  • ios苹果系统,js 滑动屏幕、锚定无效
  • Go 标准库 encoding/gob 快速上手
  • NLP学习路线图(三十一): 迁移学习在NLP中的应用
  • 在ROS中实现消息通信和服务通信Python
  • 【图像处理基石】如何构建一个简单好用的美颜算法?
  • 【win | docker开启远程配置】使用 SSH 隧道访问 Docker的前操作
  • 手拉手处理RuoYi脚手架常见文问题
  • win11系统 Docker Desktop 突然提示Docker Engine stopped解决情况之一
  • CentOS 7.9安装Nginx1.24.0时报 checking for LuaJIT 2.x ... not found
  • 【Linux】系统部分——进程控制
  • 使用 Python + SQLAlchemy 创建知识库数据库(SQLite)—— 构建本地知识库系统的基础《一》
  • Python Cookbook-7.11 在 PostgreSQL 中储存 BLOB
  • github中main与master,master无法合并到main