滑动窗口最大值(java)
题目描述
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
示例 1:
输入:nums = [1,3,-1,-3,5,3,6,7], k = 3 输出:[3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 --------------- ----- [1 3 -1] -3 5 3 6 7 31 [3 -1 -3] 5 3 6 7 31 3 [-1 -3 5] 3 6 7 51 3 -1 [-3 5 3] 6 7 51 3 -1 -3 [5 3 6] 7 61 3 -1 -3 5 [3 6 7] 7示例 2:
输入:nums = [1], k = 1 输出:[1]
我的代码思路:
初始化:
- 创建一个结果数组
maxwindow,长度为nums.length - k + 1,用来存储每个滑动窗口的最大值。 - 变量
max_j:记录当前窗口中最大值的索引。 - 变量
maxnum:记录当前窗口的最大值。
滑动窗口遍历:
- 遍历从窗口的起点 i 到 nums.length−k,即所有窗口的起始位置。
- 如果之前记录的最大值索引
max_j还在当前窗口范围内,且max_j != 0:- 当前窗口的最大值可能是
maxnum或nums[i + k - 1](即新加入窗口的值),因此比较两者更新maxnum。
- 当前窗口的最大值可能是
- 如果
max_j不在当前窗口范围内:- 重新计算当前窗口的最大值
maxnum,从i开始遍历到窗口结束 i+k−1。 - 在遍历过程中,记录最大值
maxnum及其索引max_j。
- 重新计算当前窗口的最大值
存储结果:
- 每次计算得到的最大值存储到
maxwindow[i]中。
返回结果:
- 返回结果数组
maxwindow。
代码
class Solution {public int[] maxSlidingWindow(int[] nums, int k) {int[] maxwindow = new int[nums.length-k+1];int max_j =0; int maxnum=nums[0];for(int i = 0;i<maxwindow.length;i++){if(max_j>=i && max_j !=0){maxnum = Math.max(maxnum,nums[i+k-1]);}else{maxnum = nums[i];for(int j=i+1;j<i+k;j++){maxnum = Math.max(maxnum,nums[j]);if(nums[j]==maxnum){max_j = j;}}}maxwindow[i] =maxnum;}return maxwindow;}
}
代码的优化点
该代码在重新计算窗口最大值时,需要从头开始遍历窗口中的元素,导致最坏情况下的时间复杂度为 O(nk),其中 n 是数组长度,k是窗口大小。

改进思路
- 使用双端队列存储数组中元素的索引,从队首到队尾保持一个单调递减的顺序。
- 队列中的索引始终对应当前滑动窗口范围内的元素。
- 队列的操作规则保证队首元素总是当前窗口的最大值。
算法步骤
-
初始化:
- 创建一个结果数组
maxwindow,长度为nums.length - k + 1。 - 使用双端队列
Deque存储索引。
- 创建一个结果数组
-
滑动窗口遍历:
- 遍历数组
nums中的每个元素,索引为 i。 - 移除队首的无效索引(队首索引小于 i−k+1,说明超出当前窗口范围)。
- 从队尾开始移除所有比当前元素
nums[i]小的索引(这些索引对应的值不可能成为当前或后续窗口的最大值)。 - 将当前元素的索引 i 加入队尾。
- 如果 i 达到 k−1 或更大,将队首的元素(当前窗口最大值)加入结果数组。
- 遍历数组
-
返回结果:
- 遍历完成后,返回结果数组
maxwindow。
- 遍历完成后,返回结果数组
代码
import java.util.Deque;
import java.util.LinkedList;
class Solution {public int[] maxSlidingWindow(int[] nums, int k) {if (nums == null || nums.length == 0) return new int[0];int n = nums.length;int[] maxwindow = new int[n - k + 1];Deque<Integer> deque = new LinkedList<>(); for (int i = 0; i < n; i++) {// 移除超出窗口范围的索引if (!deque.isEmpty() && deque.peekFirst() < i - k + 1) {deque.pollFirst();} // 移除所有队尾比当前元素小的索引while (!deque.isEmpty() && nums[deque.peekLast()] < nums[i]) {deque.pollLast();} // 加入当前元素的索引deque.offerLast(i); // 当前窗口的最大值加入结果if (i >= k - 1) {maxwindow[i - k + 1] = nums[deque.peekFirst()];}} return maxwindow;}
}

查漏补缺:
Deque相关方法详解_deque方法-CSDN博客
【Java】Java双端队列Deque使用详解_dequeuejava-CSDN博客
【Java】Java队列Queue使用详解_java queue-CSDN博客
相关文章:
滑动窗口最大值(java)
题目描述 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1: 输入:nums [1,3,-1,-3,5,3,6,7]…...
sklearn学习
介绍:scaler:换算的意思 1. 归一化MinMaxScaler() 归一化的意思是将一堆数,如果比较离散,为了让数据更适合模型训练,将离散的数据压缩到0到1之间,以方便模型更高效优质的学习,而对数据的预处理…...
Ubuntu下手动设置Nvidia显卡风扇转速
在Ubuntu下,您可以使用 NVIDIA显卡驱动程序提供的工具手动调整风扇转速。以下是详细步骤: 1. 确保已安装NVIDIA显卡驱动 确保系统已经安装了正确的NVIDIA驱动: nvidia-smi如果没有输出驱动信息,请先安装驱动: sudo…...
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
点一下关注吧!!!非常感谢!!持续更新!!! 大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了: MyBatisÿ…...
ES 和Kibana-v2 带用户登录验证
1. 前言 ElasticSearch、可视化操作工具Kibana。如果你是Linux centos系统的话,下面的指令可以一路CV完成服务的部署。 2. 服务搭建 2.1. 部署ElasticSearch 拉取docker镜像 docker pull elasticsearch:7.17.21 创建挂载卷目录 mkdir /**/es-data -p mkdir /**/…...
CodeIgniter如何手动将模型连接到数据库
在CodeIgniter中,模型通常是自动与数据库连接的,因为模型类(CI_Model)已经内置了对数据库操作的支持。但是,如果你需要手动指定数据库连接或者进行一些特殊的数据库配置,你可以通过几种方式来实现。 1. 使…...
商用密码应用安全性评估,密评整体方案,密评管理测评要求和指南,运维文档,软件项目安全设计相关文档合集(Word原件)
一、 密码应用安全性评估方案 (一) 密码应用测评工作思路 1.1.1. 测评准备活动的主要任务 1.1.2. 测评准备活动的输出文档 1.2. 方案编制活动 1.2.1. 方案编制活动的主要任务 1.2.2. 方案编制活动的输出文档 1.3. 现场预评估活动 1.3.1. 现场测评…...
AI赋能电商:构建高效、智能化的新零售生态
随着人工智能(AI)技术的不断进步,其在电商领域的应用日益广泛,从购物推荐到供应链管理,再到商品定价,AI正在全面改变传统电商的运营模式,并推动行业向智能化和精细化方向发展。本文将探讨如何利…...
【GAMES101笔记速查——Lecture 19 Cameras,Lenses and Light Fields】
本章节内容:相机、棱镜、光场 计算机图形学的两种成像方法: 1.合成方法:光栅化、光线追踪(展示出现实没有的东西) 2.捕捉方法:相机(捕捉现实已有的东西) 目录 1 相机 1.1 针孔相…...
虚拟机上搭建达梦DSC简略步骤
vmware 17 centos 7.6 达梦 dm8_20240920_x86_rh7_64.iso cd /d C:\Program Files (x86)\VMware\VMware Workstation\.\vmware-vdiskmanager.exe -c -s 100MB -a lsilogic -t 2 "F:\vm\dmdsc\sharedisk\share-dcr.vmdk" .\vmware-vdiskmanager.exe -c -s 100MB -a l…...
Python和R荧光分光光度法
🌵Python片段 Python在处理荧光分光光度法数据方面非常强大,得益于其丰富的数据处理和可视化库,可以轻松实现从数据读取到分析的完整流程。荧光分光光度法用于测量物质在激发光照射下发出的荧光强度,常用于定量分析和特性研究。 …...
电子学习中的关键游戏化元素
游戏化彻底改变了电子学习领域,提供了一种使学习具有吸引力、互动性和有效性的方法。通过将类似游戏的功能集成到教育平台中,教育工作者可以增强动力,提高知识记忆,并创造动态的学习体验。游戏化的关键要素为设计与学习者产生共鸣…...
算法日记 33 day 动态规划(打家劫舍,股票买卖)
今天来看看动态规划的打家劫舍和买卖股票的问题。 上题目!!!! 题目:打家劫舍 198. 打家劫舍 - 力扣(LeetCode) 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金…...
JavaScript的let、var、const
这张图片主要介绍了JavaScript中的三种变量声明方式:let、var和const。 1. let 含义:let是现在实际开发中常用的变量声明方式。特点: 块级作用域:let声明的变量只在其所在的块级作用域内有效。例如:{let x 10; } co…...
C语言-数学基础问题
一.奇数、偶数问题 1.从键盘上输入一个整数,判断并输出它是奇数还是偶数。 //从键盘上输入一个整数,判断并输出它是奇数还是偶数。 main() {int i;printf("输入一个整数:\n");scanf("%d",&i);if(i%20)printf("它是偶数\n…...
解决单元测试时找不到类名
场景: springboot单元测试mockito对mapper进行mock时: tk.mybatis.mapper.mapperexception: 无法获取实体类 XX.xx 对应的表名 分析: 使用了一个方法:Example examplenew Example(User.class); 进入源码后发现Entityhelper没…...
从零开始-VitePress 构建个人博客上传GitHub自动构建访问
从零开始-VitePress 构建个人博客上传GitHub自动构建访问 序言 VitePress 官网:VitePress 中文版 1. 什么是 VitePress VitePress 是一个静态站点生成器 (SSG),专为构建快速、以内容为中心的站点而设计。简而言之,VitePress 获取用 Markdown…...
【案例学习】如何使用Minitab实现包装过程的自动化和改进
Masimo 是一家全球性的医疗技术公司,致力于开发和生产各种行业领先的监控技术,包括创新的测量、传感器和患者监护仪。在 Masimo Hospital Automation 平台的助力下,Masimo 的连接、自动化、远程医疗和远程监控解决方案正在改善医院内外的护理…...
【ArcGISPro】使用AI提取要素-土地分类(sentinel2)
Sentinel2数据处理 【ArcGISPro】Sentinel-2数据处理-CSDN博客 土地覆盖类型分类 处理结果...
深度解析:Nginx模块架构与工作机制的奥秘
文章目录 前言Nginx是什么?Ngnix特点: 一、Nginx模块与工作原理1.Nginx的模块1.1 Nginx模块常规的HTTP请求和响应的流程图:1.2 Nginx的模块从结构上分为如下三类:1.3 Nginx的模块从功能上分为如下三类: 2.Nginx的进程模型2.1 Nginx进程结构2.2 nginx进程…...
【机器学习】Stacking模型融合:从原理到实战的进阶指南
1. 为什么需要Stacking模型融合? 当你用单一模型处理复杂数据时,经常会遇到这样的困境:线性回归对非线性关系束手无策,决策树容易过拟合,神经网络需要大量调参。我在去年参加Kaggle房价预测比赛时就深有体会——当时用…...
2026年小白适用Hermes Agent/OpenClaw Token Plan集成全攻略大全
2026年小白适用Hermes Agent/OpenClaw Token Plan集成全攻略大全。OpenClaw作为阿里云生态下新一代的开源AI自动化代理平台,曾用名Moltbot/Clawdbot,凭借“自然语言交互自动化任务执行大模型智能决策”的核心能力,正在重构个人与企业的工作效…...
别再乱调了!AUTOSAR DEM中Debounce参数(步长、阈值)的实战配置指南与避坑
AUTOSAR DEM中Debounce参数实战:从电压过压到通讯超时的精准调优 在汽车电子系统的故障诊断中,误报和漏报就像一对难以调和的矛盾体。我曾见过一个项目因为电压过压检测过于敏感,导致车辆在颠簸路面频繁误报故障;也遇到过通讯超时…...
请教指针初始化:定义指针时,要么直接指向有效内存,要么置为NULL
在技术领域,我们常常被那些闪耀的、可见的成果所吸引。今天,这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力,让我们得以一窥未来的轮廓。然而,作为在企业一线构建、部署和维护复杂系统的实践者,我们深知…...
5G网络中的存储功能革新:NRF技术深度解析
5G网络中的存储功能革新:NRF技术深度解析 在5G通信技术的快速发展浪潮中,网络功能虚拟化(NFV)与软件定义网络(SDN)作为两大核心支柱,正引领着网络架构的深刻变革。其中,网络存储功能…...
PyTorch转ONNX时,如何正确设置动态输入尺寸(以RetinaFace多输出为例)
PyTorch转ONNX时动态输入尺寸的精准配置实战:以RetinaFace多输出为例 在模型部署的实际工程中,PyTorch到ONNX的转换常常会遇到动态输入尺寸的挑战,特别是当模型具有多个输出时(如RetinaFace同时输出边界框、关键点和置信度&#x…...
Java 判断选择循环
一、判断1.应用场景:只有满足条件,对应的代码才能执行2.三种形式:3.示例:4.注意事项:二、选择1.使用:把所有的选择一一列举出来,根据不同的条件任选其一2.格式:3.示例:4.…...
【SITS2026权威前瞻】:AI研发自动化测试的5大范式跃迁与2024落地避坑指南
更多请点击: https://intelliparadigm.com 第一章:AI研发自动化测试:SITS2026专题 随着大模型驱动的研发范式演进,AI系统本身的可测试性面临全新挑战——模型行为非确定、输入空间高维、验证标准模糊。SITS2026(Softw…...
芯片低功耗设计:从动态/静态功耗原理到DVFS与电源门控实战
1. 从“功耗”到“能效”:一个芯片工程师的视角在半导体行业摸爬滚打了十几年,我越来越深刻地体会到,芯片设计早已不是单纯追求性能的“百米冲刺”,而是一场关于“能效”的马拉松。性能决定了你的芯片能跑多快,而功耗则…...
家政派单小程序源头厂家
随着现代生活节奏的加快,家政服务的需求日益增长。为了满足这一需求,许多公司开始推出家政派单小程序,以提供更便捷、高效的服务体验。然而,在众多的选择面前,如何找到一家真正能够满足自身业务需求的源头厂家呢&#…...
