【LeetCode 热题 100】239. 滑动窗口最大值——(解法一)滑动窗口+暴力解

Problem: 239. 滑动窗口最大值
题目:给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值 。

文章目录

  • 整体思路
  • 完整代码
  • 时空复杂度
    • 时间复杂度:O(N * k)
    • 空间复杂度:O(k)
  • 注意:暴力解会超时

整体思路

这段代码的目的是解决经典的 “滑动窗口最大值” 问题。即,在一个整数数组 nums 中,找出一个大小为 k 的滑动窗口在从左到右移动时,每个窗口内的最大值。

该算法实现了一种 模拟滑动窗口 的暴力解法。它虽然使用了双端队列(Deque)这一数据结构,但并没有发挥其在最优解法(单调队列)中的关键作用,而是仅仅将其用作一个普通的队列来存储当前窗口内的所有元素。

其核心逻辑步骤如下:

  1. 初始化

    • 创建一个结果数组 ans,其长度为 n - k + 1,因为这正是滑动窗口的总数。
    • 创建一个双端队列 win,用来存储当前滑动窗口中的所有元素。
  2. 滑动窗口模拟

    • 算法使用一个 for 循环,由 right 指针驱动,从左到右遍历整个 nums 数组。right 代表窗口的右边界。
    • 窗口维护
      a. 元素出队(收缩窗口):当窗口已经形成并需要向右滑动时(即 right > k - 1,意味着要加入第 k+1 个元素了),就从队列的头部弹出一个元素(win.pop())。这模拟了窗口最左边的元素移出窗口的过程。
      b. 元素入队(扩张窗口):将当前 right 指针指向的元素 nums[right] 加入到队列的尾部(win.add())。
    • 通过这两步,win 队列始终保持着当前滑动窗口内的所有元素。
  3. 查找当前窗口最大值(暴力法)

    • 【效率瓶颈】 在每次更新窗口后,代码会进入一个内部的 for-each 循环,遍历 win 队列中的 所有元素,以线性扫描的方式找出当前窗口的最大值 max
    • 这是该算法效率不高的根本原因。
  4. 记录结果

    • 当窗口首次形成(即 right >= k - 1)以及后续的每次滑动后,将上一步找到的最大值 max 存入结果数组 ans 的相应位置(ans[right - k + 1])。
  5. 返回结果

    • 遍历结束后,返回填充好的 ans 数组。

总结来说,这是一个思路直接、易于理解的解法:用队列维护窗口元素,每次滑动后,重新扫描整个窗口找到最大值。

完整代码

class Solution {/*** 计算滑动窗口的最大值。* @param nums 整数数组* @param k 窗口大小* @return 包含每个窗口最大值的数组*/public int[] maxSlidingWindow(int[] nums, int k) {int n = nums.length;// 计算结果数组的长度,即滑动窗口的总数int m = n - k + 1;// ans 用于存储每个窗口的最大值int[] ans = new int[m];// win 是一个双端队列,在此实现中被用作普通队列来存储当前窗口的所有元素Deque<Integer> win = new ArrayDeque<>(k); // 初始化容量为k// right 指针作为窗口的右边界,遍历整个数组for (int right = 0; right < n; right++) {// 当窗口大小即将超过 k 时,需要从左侧移除一个元素// right > k - 1 意味着我们正要处理第 k+1 个元素(从0计数),此时窗口已满if (right > k - 1) {// win.pop() 从队列头部移除元素,模拟窗口向右滑动win.pop();}// 将当前 right 指针指向的元素加入队列尾部win.add(nums[right]);// 【效率瓶颈】// 在每次窗口更新后,暴力遍历当前窗口中的所有元素以查找最大值int max = Integer.MIN_VALUE;for (int x : win) {// 使用三元运算符更新最大值max = max > x ? max : x;}// 当窗口大小达到 k 时,开始记录结果// right >= k - 1 标志着第一个完整的窗口已经形成if (right >= k - 1) {// 计算当前窗口在结果数组 ans 中的索引ans[right - k + 1] = max;}}return ans;}
}

时空复杂度

时间复杂度:O(N * k)

  1. 外层循环for (int right = 0; right < n; right++) 遍历整个输入数组 nums,执行 N 次,其中 Nnums 的长度。
  2. 内层循环for (int x : win) 循环遍历 win 队列中的所有元素。win 队列的大小始终保持在 k 或小于 k。在窗口形成后,其大小恒为 k。因此,这个内层循环每次执行的操作数是 O(k)
  3. 循环内部操作:队列的 pop()add() 操作的平均时间复杂度都是 O(1)。

综合分析
算法的总时间复杂度由外层循环和内层循环的乘积决定。外层循环执行 N 次,每次内部都进行一次 O(k) 的扫描。因此,总的时间复杂度为 N * O(k) = O(N * k)

空间复杂度:O(k)

  1. 主要存储开销:算法使用了一个双端队列 win 来存储窗口内的元素。
  2. 空间大小win 队列的大小最多为 k,因为它存储的是一个大小为 k 的滑动窗口的元素。
  3. 结果数组ans 数组的大小是 N - k + 1,属于 O(N) 级别。在复杂度分析中,输出结果所占用的空间通常不计入 额外辅助空间(auxiliary space)

综合分析
算法所需的额外辅助空间主要由 win 队列决定。因此,其空间复杂度为 O(k)。如果把输出数组也计算在内,则总空间为 O(N)。按照标准,我们通常只分析辅助空间,即 O(k)

注意:暴力解会超时

这个方法时间复杂度为O(N * k),会超时。

【LeetCode 热题 100】239. 滑动窗口最大值——(解法二)滑动窗口+单调队列

【LeetCode 热题 100】239. 滑动窗口最大值——(解法三)滑动窗口+单调队列+数组

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/89169.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/89169.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

攻防世界-MISC-red_green

知识点 1.pngLSB隐写 步骤 方法一&#xff1a;zsteg 打开附件&#xff0c;是一张图片&#xff0c;打开看不懂&#xff08;其实由两种颜色构成&#xff0c;0和1&#xff09;&#xff0c;用zsteg查看&#xff0c;发现隐写了一张jpg图片&#xff0c;使用zsteg提取。打开jpg图片…

归因问答-如何进行自动评估

归因模型函数g的形式化表示 输入&#xff1a;用户问题q 输出&#xff1a;(a, p), 其中a为答案&#xff0c;p为原始文章中支持答案a的段落。 1&#xff09;单样本归因 针对输入问题q&#xff0c;如何评估归因模型g输出中段落p是对答案a的正确归因。 在论文arributed qa中&…

基于vue+View UI的组织机构选择

1、效果 1、代码 <template><Button type"primary" click"modal true">点击选择</Button><div v-if"selectedArr.length > 0"><p>已选择项&#xff1a;</p><div v-for"(item, index) in sel…

人大金仓Kingbase数据库KSQL 常用命令指南

人大金仓Kingbase数据库KSQL 常用命令指南 1. 连接与基本操作 1.1 连接数据库 # 基础语法 ksql -U 用户名 -d 数据库名 -h 主机名 -p 端口号 # 示例 ksql -U system -d testdb -h 127.0.0.1 -p 543211.2 执行SQL脚本 # 基础语法 ksql -U <用户名> -W -f <SQL脚本文…

从萌芽到领航:广州华锐互动的 AR 奋进之路​

在 AR 技术这片充满无限可能的领域中&#xff0c;广州华锐互动数字科技有限公司宛如一颗耀眼的新星&#xff0c;熠熠生辉。广州华锐互动成立于 2008 年&#xff0c;在那个 AR 技术尚处于萌芽阶段、大众认知度还较低的时期&#xff0c;广州华锐互动便凭借着前瞻性的战略眼光和对…

redisson看门狗实现原理

Redisson 看门狗&#xff08;Watch Dog&#xff09;机制实现原理 Redisson 的 Watch Dog 机制是分布式锁的核心组件之一&#xff0c;用于 自动续期 锁的过期时间&#xff0c;防止业务逻辑执行时间超过锁的持有时间&#xff0c;导致锁提前释放而引发并发问题。以下是其实现原理…

C++中explicit详解

文章目录 1. **防止隐式类型转换**示例1&#xff1a;没有使用explicit示例2&#xff1a;使用explicit 2. **防止拷贝初始化**示例1&#xff1a;没有使用explicit示例2&#xff1a;使用explicit 3. **防止隐式类型转换的链式调用**示例1&#xff1a;没有使用explicit示例2&#…

代码部落 20250629 CSP-J复赛 模拟赛

网址&#xff1a;代码部落 一&#xff1a; 相濡以沫 β&#xff08;代码请自写&#xff09; 签到题&#xff0c;如果a[i]<a[i1] a[i]a[i1],反之&#xff0c;直接输出No 二 共同富裕&#xff08;代码请自写&#xff09; 签到题&#xff0c;用sort前缀和 如果最富有的个…

零基础学习RabbitMQ(5)--工作模式(1)

在前面的章节中我们简单介绍过一些RabbitMQ的工作模式&#xff0c;RabbitMQ共提供了七种工作模式进行消息传递&#xff0c;这里我们来详细介绍。 1. Simple(简单模式) P&#xff1a;生产者 C&#xff1a;消费者 特点&#xff1a;一个生产者一个消费者&#xff0c;消息只能被…

Android Liunx ffmpeg交叉编译

本文的交叉编译在window上安装VMware&#xff0c;使用Ubuntu20.4进行的编译。 一、安装NDK&#xff1a; 1、下载解压&#xff1a; 在NDK 下载 | Android NDK | Android Developers下载Liunx平台的NDK。 本人下载的是android-ndk-r27c-linux.zip版本的。 解压android-ndk-r…

极海G32R501双向数字电源解决方案 赋能AI服务器及电源应用创新

6月26日&#xff0c;Big-Bit商务网主办的2025中国电子热点解决方案创新峰会在东莞召开&#xff0c;峰会以“核心智变、能效跃迁”为主题&#xff0c;聚焦光储充、800V超充、AI服务器、BMS、智能汽车照明与汽车中小电机电控应用。 峰会期间&#xff0c;珠海极海半导体有限公司&a…

【修电脑的小记录】连不上网

问题概述 问题表现为&#xff1a;电脑连接网络后&#xff0c;显示已连接但无法上网。 环境信息&#xff1a; - DNS 修改无效&#xff0c;ping 外网&#xff08;8.8.8.8&#xff09;失败 - 尝试重置网络参数、多种命令无果 &#x1f50d; 排查过程 1. 执行以下命令重置网络&a…

QT中QSS样式表的详细介绍

转自个人博客 **Qt样式表&#xff08;Qt Style Sheets&#xff0c;简称QSS&#xff09;**是一种类似于HTML中的CSS&#xff08;层叠样式表&#xff09;的机制&#xff0c;用于自定义Qt应用程序的外观。通过QSS&#xff0c;开发者可以轻松地修改控件的外观&#xff0c;而无需更改…

Spring 依赖注入:官方推荐方式及最佳实践

Spring 依赖注入&#xff1a;官方推荐方式及最佳实践 你正在遭遇以下困境吗&#xff1f; 项目变大后&#xff0c;依赖关系像一团乱麻&#xff0c;牵一发而动全身&#xff1f;单元测试难如登天&#xff0c;被迫启动整个Spring容器&#xff1f;NullPointerException 总在运行时突…

javaweb听课笔记day1

MySQL数据模型 关系型数据库: 通过表来存储数据 关系型数据库是建立在关系模型基础上的数据库&#xff0c;简单说&#xff0c;关系型数据库是由多张能互相连接的二维表组成的数据库 优点: 都是使用表结构&#xff0c;格式一致&#xff0c;易于维护;使用通用的SQL语言操作…

《从量子奇境到前端优化:解锁卡西米尔效应的隐藏力量》

卡西米尔效应由荷兰物理学家亨德里克卡西米尔于1948年提出&#xff0c;它源于量子场论中“真空不空”的奇异观点。在传统认知里&#xff0c;真空是一片虚无&#xff0c;但量子理论指出&#xff0c;真空中充满了持续涨落的能量&#xff0c;即零点能。想象有两片中性的金属板被放…

【学习笔记】强化学习的数学原理

软活硬整&#xff0c;纳什又把RL翻出来讲了一遍&#xff0c;我以为是温故而知新&#xff0c;原来是在卖书。 不过温故而知新还是没啥毛病的。 PS&#xff1a;今天装Notepad时看到的&#xff0c;我还以为现在连用个Notepad都要给天线宝宝们捐款了。 文章目录 PART 11 overview…

深入“火星棒球数据API”:用数据解锁棒球世界的无限可能

在棒球运动日益数据化的今天&#xff0c;高效获取和处理海量比赛信息已成为球队制胜、媒体解读、球迷深入理解比赛的关键。“火星棒球数据API” 应运而生&#xff0c;成为连接棒球智慧与大数据技术的桥梁。本文将探讨这一API的核心价值、功能亮点及其如何重塑我们体验和分析棒球…

[附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+jsp实现的校园服务平台管理系统,推荐!

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本校园服务平台管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据…

「Java EE开发指南」如何用MyEclipse创建一个WEB项目?(三)

在本文中&#xff0c;您可以找到有关WEB项目的信息。将了解&#xff1a; Web项目结构和参数Web开发生产力工具JSP代码完成和验证 这些特性在MyEclipse中可用。在上文中&#xff08;点击这里回顾>>&#xff09;&#xff0c;我们为大家介绍了Web开发效率工具、Web项目参数…