可视化图解算法49:滑动窗口的最大值

牛客网 面试笔试 TOP101    |     LeetCode 239. 滑动窗口最大值

1. 题目

描述

给定一个长度为 n 的数组 nums 和滑动窗口的大小 size ,找出所有滑动窗口里数值的最大值。

例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。

数据范围: 1 ≤sizen≤10000,数组中每个元素的值满足 |val| ≤10000

要求:空间复杂度 O(n),时间复杂度 O(n)

示例1

输入:

[2,3,4,2,6,2,5,1],3

返回值:

[4,4,6,6,6,5]

示例2

输入:

[9,10,9,-7,-3,8,2,-6],5

返回值:

[10,10,9,8]

示例3

输入:

[1,2,3,4],3

返回值:

[3,4]

2. 解题思路

本题可以通过双端队列完成,先来看一下什么是双端队列:

双端队列是一种允许在队列头部和尾部进行插入(enqueue)删除(deque)操作的线性数据结构。它结合了队列(FIFO)栈(LIFO)的特性,具有高度的灵活性。

核心特性

  1. 双向操作:

    支持在队头(Front)和队尾(Rear)进行插入(push_front, push_back)和删除(pop_front, pop_back)。

  2. 灵活性:

    既可以实现普通队列的先进先出(FIFO),也可以实现栈的后进先出(LIFO)。

  3. 时间复杂度:

    大多数实现(如链表或动态数组)的插入和删除操作时间复杂度为 O(1)


与普通队列的区别

操作普通队列双端队列
插入只能在队尾插入队头和队尾均可插入
删除只能在队头删除队头和队尾均可删除

双端队列(Deque,全称 Double-ended Queue)是一种允许在队列的头部和尾部同时进行插入和删除操作的数据结构。它结合了队列(FIFO)和栈(LIFO)的特性,是许多算法和场景中的高效工具。


常见应用场景

  • 滑动窗口算法:如求最大值/最小值的窗口(方便两端操作)。

  • 回文检测:从两端向中间逐对比较字符。

  • 撤销操作:保存操作历史,支持前进/后退(类似浏览器历史)。

  • 多线程工作窃取:如 Java 的 ForkJoinPool 使用双端队列平衡任务分配。

如果文字描述的不太清楚,你可以参考视频的详细讲解。

  • Python版本:Python数据结构LeetCode笔试面试算法_哔哩哔哩_bilibiliPython数据结构LeetCode笔试面试算法,bilibili课堂,哔哩哔哩课堂,哔哩哔哩,Bilibili,B站,弹幕https://www.bilibili.com/cheese/play/ep1372595

  • Java版本:哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ep1367851

  • Golang版本:哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ep1364849

3. 编码实现

核心代码如下:

/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param num int整型一维数组* @param size int整型* @return int整型一维数组*/
func maxInWindows(num []int, size int) []int {// write code hereres := make([]int, 0)//窗口大于数组长度的时候,返回空if size == 0 || size > len(num) {return res}//1. 定义一个双端队列(队列中存储的是数组元素的下标)dq := newDeque()//2. 先遍历第一个窗口for i := 0; i < size; i++ {//队列中只保留单调递减的序列(将所有比 当前值 小的元素全部弹出);队列中存储的是数组元素的下标,下标对应的数组元素为单调递减for !dq.isEmpty() && (num[dq.back()] < num[i]) {dq.popBack()}//当前值入队列(加入队列的值为:数组下标)dq.pushBack(i)}//3. 遍历后续数组元素for i := size; i < len(num); i++ {//3.1 取窗口内的最大值index := dq.front()res = append(res, num[index])//3.2 判断队列的头部的下标是否过期if !dq.isEmpty() && (i-dq.front()+1) > size {dq.popFront() //头部出队列}//3.3 队列中只保留单调递减的序列(将所有比 当前值 小的元素全部弹出)for !dq.isEmpty() && num[dq.back()] < num[i] {dq.popBack() //弹出较小的值,尾部出队列}//3.4 当前值入队列(加入队列的值为:数组下标)dq.pushBack(i)}//4. 最后还剩一组res = append(res, num[dq.front()])return res}

具体完整代码你可以参考下面视频的详细讲解。

  • Python版本:Python数据结构LeetCode笔试面试算法_哔哩哔哩_bilibiliPython数据结构LeetCode笔试面试算法,bilibili课堂,哔哩哔哩课堂,哔哩哔哩,Bilibili,B站,弹幕https://www.bilibili.com/cheese/play/ep1372595

  • Java版本:LeetCode数据结构笔试面试算法-Java版_哔哩哔哩_bilibiliLeetCode数据结构笔试面试算法-Java版,bilibili课堂,哔哩哔哩课堂,哔哩哔哩,Bilibili,B站,弹幕https://www.bilibili.com/cheese/play/ep1367851

  • Golang版本:哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ep1364849

4.小结

通过双端队列来求解滑动窗口的最大值,具体步骤为:

  1. 定义一个双端队列,队列中存储数组元素的下标;

  2. 队列中下标对应的元素为单调递减;

  3. 依次将数组中的下标入队列。在此过程除了满足条件1与2外,还需要满足:队列中头部下标不能过期,即 i<(front(dq)+size),其中i为数组的下标,dp为双向队列,size为窗口大小。

《数据结构与算法》深度精讲课程正式上线啦!7 大核心算法模块全解析:

    ✅   链表

    ✅   二叉树

    ✅   二分查找、排序

    ✅   堆、栈、队列

    ✅   回溯算法

    ✅   哈希算法

    ✅   动态规划

无论你是备战笔试面试、提升代码效率,还是突破技术瓶颈,这套课程都将为你构建扎实的算法思维底座。🔥立即加入学习打卡,与千名开发者共同进阶!

  • Python编码实现:哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ss897667807

  • Java编码实现:哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ss161443488

  • Golang编码实现:LeetCode数据结构笔试面试算法-Go语言版_哔哩哔哩_bilibiliLeetCode数据结构笔试面试算法-Go语言版,bilibili课堂,哔哩哔哩课堂,哔哩哔哩,Bilibili,B站,弹幕https://www.bilibili.com/cheese/play/ss63997

对于数据结构与算法,我们总结了一套【可视化+图解】方法,依据此方法来解决相关问题,算法变得易于理解,写出来的代码可读性高也不容易出错。具体也可以参考视频详细讲解。

今日佳句:此情可待成追忆?只是当时已惘然。

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

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

相关文章

【信息系统项目管理师-论文真题】2025上半年(第一批)论文详解(包括解题思路和写作要点)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文:信息系统项目的交付绩效域解题思路写作要点交付绩效域的核心内涵交付绩效域的关键要素为有效执行交付绩效域,项目经理需要关注的重点项目管理五大过程组中绩效域的协同目标论文:信息系统项目的交付绩效…

如何写高效的Prompt?

概述 提示词(Prompt)的质量将直接影响模型生成结果的质量&#xff0c;所以精心设计一个让大模型能够理解并有效回复的提示词是至关重要的。本文内容自论文中获取&#xff1a;https://arxiv.org/pdf/2312.16171 介绍了5类共计26条提示词书写原则。 书写原则 类别原则备注快速…

Vue在线预览excel、word、ppt等格式数据。

目录 前言 1.安装库 2.预览文件子组件代码 3、新建store/system.ts 4、父页面进行使用 总结 前言 纯前端处理文件预览&#xff0c;包含excel、word、ppt、txt等格式&#xff0c;不需要后端服务器进行部署&#xff0c;并且内网也可以使用。 1.安装库 npm install vue-offi…

【小沐杂货铺】基于Three.JS绘制太阳系Solar System(GIS 、WebGL、vue、react,提供全部源代码)第2期

&#x1f37a;三维数字地球系列相关文章如下&#x1f37a;&#xff1a;1【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第一期2【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第二期3【小沐学GIS】…

Fullstack 面试复习笔记:项目梳理总结

Fullstack 面试复习笔记&#xff1a;项目梳理总结 之前的笔记&#xff1a; Fullstack 面试复习笔记&#xff1a;操作系统 / 网络 / HTTP / 设计模式梳理Fullstack 面试复习笔记&#xff1a;Java 基础语法 / 核心特性体系化总结 这篇笔记主自用&#xff0c;系统地梳理一下最近…

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…

float和float32有什么区别

这是一个非常重要但容易混淆的问题。我们来一步一步讲清楚&#xff1a; ✅ 简答&#xff1a;float 和 float32 的区别 项目float&#xff08;通用名称&#xff09;float32&#xff08;精确定义&#xff09;含义通常指“浮点数”&#xff0c;具体精度由语言/平台决定明确指 32 …

openvino如何在c++中调用pytorch训练的模型

步骤1&#xff1a;将PyTorch模型转换为ONNX格式 转换代码示例&#xff08;Python&#xff09; import torch import torchvision1. 加载训练好的PyTorch模型 model torchvision.models.resnet18(pretrainedTrue) model.eval() # 设置为评估模式2. 创建虚拟输入&#xff08…

OpenCV CUDA模块特征检测------创建Harris角点检测器的GPU实现接口cv::cuda::createHarrisCorner

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数创建一个 基于 Harris 算法的角点响应计算对象&#xff0c;专门用于在 GPU 上进行高效计算。 它返回的是一个 cv::Ptrcv::cuda::Cornernes…

html文字红色粗体,闪烁渐变动画效果

1. 代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>红色粗体闪烁文字表格</title><s…

Springboot独立学院资产管理系统k0o7w(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能:财务员,校级管理员,部门,部门管理员,资产类型,资产信息,资产调拨,资产申购,申购入库,资产出库,资产报废,资产维修,资产盘点,维修复审 开题报告内容 基于Spring Boot的独立学院资产管理系统开题报告 一、选题背景与意义 &#xff08;一&#xff0…

基于javaweb的SpringBoot药房管理系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

Web前端之隐藏元素方式的区别、Vue循环标签的时候在同一标签上隐藏元素的解决办法、hidden、display、visibility

MENU 标签区别速览详解✅ v-if✅ v-show✅ :style"{ display: ... }"⚠️ :hidden⚠️ :style"{ visibility: ... }" 总结 标签 <div v-for"item in list" v-if"item.isShow">{{item.name}}</div> <div v-for"it…

Kafka 安装教程(支持 Windows / Linux / macOS)

一、下载 1、kafka官网下载地址:https://kafka.apache.org/downloads 根据实际情况下载对应的版本 2、JDK的版本最好是17+ JDK下载地址:https://www.oracle.com/java/technologies/javase/jdk17-0-13-later-archive-downloads.html 二、安装 前置条件 安装 Java(至少 Jav…

Linux研学-用户解析

一 root用户 1 介绍 root是Linux系统中唯一的超级管理员账户&#xff0c;拥有系统的最高权限&#xff08;UID0&#xff09;&#xff0c;可执行任何操作&#xff0c;包括修改系统文件、安装/卸载软件、管理用户权限等。   如普通用户无法在根目录下创建文件&#xff0c;而roo…

设计模式系列(07):建造者模式(Builder)

本文为设计模式系列第7篇&#xff0c;聚焦创建型模式中的建造者模式&#xff0c;涵盖定义、原理、实际业务场景、优缺点、最佳实践及详细代码示例&#xff0c;适合系统学习与实战应用。 目录 1. 模式概述2. 使用场景3. 优缺点分析4. 实际应用案例5. 结构与UML类图6. 代码示例7…

HBuilder 发行Android(apk包)全流程指南

一、前言 小程序以其便捷性和轻量性受到越来越多开发者的青睐。HBuilder 作为一款强大的开发工具&#xff0c;为小程序开发提供了极大的便利。本文将详细介绍如何通过 HBuilder 完成小程序的开发与发行。 二、环境准备 1. 安装 HBuilder 访问 DCloud 官方网站&#xff0c;下…

React 18新特性介绍

React 18是React团队于2022年发布的一个重要版本&#xff0c;它引入了多项改进和新特性&#xff0c;在提升性能的同时也带来了一些使用上的变化。本文将全面介绍React 18的主要新特性&#xff0c;包括并发渲染、API更新、浏览器兼容性等重要内容&#xff0c;并通过代码示例说明…

设计模式——面向对象设计六大原则

摘要 本文详细介绍了设计模式中的六大基本原则&#xff0c;包括单一职责原则、开放封闭原则、里氏替换原则、接口隔离原则、依赖倒置原则和合成复用原则。每个原则都通过定义、理解、示例三个部分进行阐述&#xff0c;旨在帮助开发者提高代码的可维护性和灵活性。通过具体代码…

使用 So-VITS-SVC 实现明星声音克隆与视频音轨替换实战全流程

本文展示如何使用开源项目 so-vits-svc 实现声音克隆与视频音轨替换流程&#xff0c;适用于 AI 音频工程、声音合成等学习场景。所述内容仅限技术交流&#xff0c;禁止用于非法用途。 一、项目背景 此项目采用 so-vits-svc 4.1 开源框架&#xff0c;实现了“用明星声音替换视频…