【Hello Algorithm】滑动窗口内最大值最小值
滑动窗口介绍
滑动窗口是一种我们想象中的数据结构 它是用来解决算法问题的

我们可以想象出一个数组 然后再在这个数组的起始位置想象出两个指针 L 和 R

我们对于这两个指针做出以下规定
- L 和 R指针只能往右移动
- L指针不能走到R指针的右边
- 我们只能看到L指针和R指针中间的数字
比如说当前L和R指针重合 我们就什么数字都看不见
如果此时R指针往右走一步 那么我们就能看到L指针和R指针中间的数组的数字
又因为这种移动的方式特别像滑动 所以说我们将这种想象出来的数据结构叫做滑动窗口
如何确定一个滑动窗口内的最大值
如果我们每次都遍历去获取滑动窗口的最大值的话那么每次获取的时间复杂度就是O(N)了 这样子明显很复杂 所以说我们需要想想别的方式去找到最大值
这里直接给出结论:
- 我们使用双端队列去获取一个滑动窗口内的最大值
- 双端队列的意义是 : 此时开始缩小滑动窗口 哪些数字可能成为最大值
为了让双端队列能够实现它的意义 我们做出以下规定
- 让R指针向右滑动的时候 我们从右边插入数字的下标到双端队列中
- 如果说插入的数字要大于原来的数字 我们让原来的数字出队列
- 让L指针向右滑动的时候 我们从左边开始比较双端队列第一个(左边数起)下标和L指针的下标
- 如果说L指针的下标要大于双端队列最左边的下标 则将其弹出
至于C++中的双端队列 大家可以参考这篇博客 双端队列
窗口内最大值
假设一个固定大小为W的窗口 依次划过数组arr
让你依次返回每次窗口移动时窗口中的最大值
假设数组arr为 【4 , 3 , 5 ,4, 3, 3, 6, 7】 W = 3
返回【5 , 5, 5, 4, 6, 7】
这道题目实际上就是一个滑动窗口最大值的简单版本
我们使用一个双端队列就能很轻松的实现
面对这个问题我们可以拆分成两部分来解决
- 首先把滑动窗口的大小扩大到3
- 接着滑动窗口整体开始移动
两部分的代码都不算难 代码表示如下
void process5(vector<int>& arr , vector<int>& ans , int W)
{deque<int> dq(0 , 0);for (int R = 0; R < W; R++){while (!dq.empty() && arr[dq.front()] <= arr[R]){dq.pop_back();} dq.push_back(R); }
int R = W - 1; int L = 0; int N = static_cast<int>(arr.size()); while (R < N) { while (!dq.empty() && arr[dq.back()] <= arr[R]) { dq.pop_back();} dq.push_back(R);while (L > dq.front()) { dq.pop_front();} ans.push_back(arr[dq.front()]);L++; R++;}
}
这道题目给我们的提醒主要有两个
- 当我们R指针右移的时候要使用while来进行判断
- R指针在初始化之后要重置 否则会出现一些错误 为了避免这些错误 我们最好每次使用一个变量之前对其进行初始化
子数组中符合条件的个数
给定一个整形数组arr 和一个整数num
某个arr中的子数组sub 必须要满足
sub中的最大值减去sub中的最小值小于等于num
返回sub中达标的子数组的数量
我们首先分析下问题
如果我们没有学过滑动窗口和双端队列 那么这道题我们会使用暴力的方式来得到答案
三个for循环嵌套 时间复杂度就变成了n的三次方 这显然是不可以的
当我们使用滑动窗口解决这个问题的时候 由于我们的左右两个下标都是单向的往右边移动 所以说此时的时间复杂度就是N
当我们得到两个下标满足上述条件时 比如说0 ~ N上的最大值减去0~N中的最小值小于等于num
此时我们就可以说 左下标为0 右下标为0 ~ N-1上的任意一个子数组都满足条件
因为此时最大值只有可能变小 最小值只有可能变大 所以说它们之间的差值肯定还是会小于等于num
所以我们就能确定 以0为左边界 N为右边界上符合条件的子数组有 N - 0 + 1个
之后我们左边界右移即可
整体思路如下
- 我们使用两个双端队列来记录子数组的最大值和最小值
- 我们让右边界一直右移动 直到子数组不满足条件为止
- 此时通过上面的技巧计算出左边界到右边界-1的满足条件子数组个数 之后左边界++
代码表示如下
int process(vector<int>& arr, int num)
{deque<int> Max_Win(0, 0);deque<int> Min_Win(0, 0);int count = 0;int R = 0;int N = static_cast<int>(arr.size());for (int L = 0; L < N; L++){while (R < N){while (!Max_Win.empty() && arr[Max_Win.back()] <= arr[R]){Max_Win.pop_back();}Max_Win.push_back(R);while (!Min_Win.empty() && arr[Min_Win.back()] >= arr[R]){Min_Win.pop_back();}Min_Win.push_back(R);if (arr[Max_Win.front()] - arr[Min_Win.front()] > num){break;}else{R++;}}count += R - L;if (Max_Win.front() == L){Max_Win.pop_front();}if (Min_Win.front() == L){Min_Win.pop_front();}}return count;
}
这里有一点需要注意的是
count += R - L;
语句必须要放到while循环的外面才行 否则会因为R下标越界的问题而导致不会执行if语句 最终导致count计算不完整
相关文章:
【Hello Algorithm】滑动窗口内最大值最小值
滑动窗口介绍 滑动窗口是一种我们想象中的数据结构 它是用来解决算法问题的 我们可以想象出一个数组 然后再在这个数组的起始位置想象出两个指针 L 和 R 我们对于这两个指针做出以下规定 L 和 R指针只能往右移动L指针不能走到R指针的右边我们只能看到L指针和R指针中间的数字 …...
HTML,CSS实现鼠标划过头像,头像突出变大(附源码)
话不多说,先上代码 先看原图: 再看 鼠标放上去后的图: 是不是明显感觉到 人物头像突出了一些,而且还增加了阴影部分的效果呢? 直接上代码!!! <!--由于我的 img 标签放的是循环后…...
“爱知道”,你知道吗?
拥抱时代浪潮,加速科技变革。数字经济时代,杭州重点贯彻市委市政府数字经济创新提质“一号发展工程”,加快发展数字经济,推动全市数字经济往高攀升、向新进军、以融提效。基于政府对数字经济新活力的赋能、优化数字社会环节、构建…...
基于SpringBoot+Vue的服装销售系统
基于SpringBootVue的服装销售平台的设计与实现~ 开发语言:Java数据库:MySQL技术:SpringBootMyBatisVue工具:IDEA/Ecilpse、Navicat、Maven 系统展示 主页 我的订单 登录界面 管理员界面 摘要 基于SpringBoot和Vue的服装销售系统…...
针对多分类问题,使用深度学习--Keras进行微调提升性能
前面的文章对二分类问题用Keras进行了Fine-tune,使得模型的准确率进一步提升,此处对于多分类问题,尝试使用Fine-tune来提升性能。 1. 准备数据集 为了演示,本次选用了博文keras系列︱图像多分类训练与利用bottleneck features进行微调(三)中提到的数据集,原始的数据集…...
一、【Photoshop如何根据不同类型图像抠图】
文章目录 前言图形结构1、规则图形2、不规则图形 图形颜色1、轮廓清晰2、颜色分明 前言 当我们有抠图需求的时候,不要一开始就想着我怎么去把它抠出来,首先应该分析图形的特点,然后再去选取合适的工具,这样才可以做到事半功倍&am…...
rust - 理解borrow trait
简介 borrow trait 是处理借用(即其它语言中的引用)的 trait,变量的所有权不会转移.泛型定义如下: pub trait Borrow<Borrowed: ?Sized> {/// Immutably borrows from an owned value.fn borrow(&self) -> &Borrowed; }其中包含一个 borrow(&self)的方…...
review-java-basis
Path环境变量用于记住程序路径,方便在命令行窗口的任意目录启动程序 \n代表换行的意思,/t代表一个tab前进一格 强转可能导致数据的丢失(溢出) 浮点型转换为整型,直接丢掉小数部分,保留整数部分返回 数据类…...
Go 语言访问 Redis 笔记
文章目录 Mac 下载 RedisMac Redix 数据库打开服务端客户端 导包连接数据库操作字符串操作 Hash设置过期时间队列操作连接池并发操作管道化操作事务操作 Mac 下载 Redis Mac安装Redis,原来就是这么简单 Mac Redix 数据库打开 brew services start redis 服务端 …...
【MySQL数据库重点】第二节:MySQL基础知识(基本操作)
目录 一:数据库的操作 1.显示数据库 2.创建数据库 3.使用数据库 4.删除数据库 二:常用数据类型 1.数值类型:整型和浮点型 2.字符串类型 3.日期类型 三:表的操作 1.查看表结构 2.创建表 3.删除表 一:数据库…...
计算机网络--第一次作业
1、比较电路交换、报文交换和分组报文交换优缺点 电路交换 电路交换是以电路连接为目的的交换方式,通信之前要在通信双方之间建立一条被双方独占的物理通道(由通信双方之间的交换设备和链路逐段连接而成)。 优点: ①由于通信线路为…...
网络协议--TCP的成块数据流
20.1 引言 在第15章我们看到TFTP使用了停止等待协议。数据发送方在发送下一个数据块之前需要等待接收对已发送数据的确认。本章我们将介绍TCP所使用的被称为滑动窗口协议的另一种形式的流量控制方法。该协议允许发送方在停止并等待确认前可以连续发送多个分组。由于发送方不必…...
鼎鑫鸿鄴引入“能源互联网+”理念 打造共赢
近年来,随着全球能源消耗的不断增长和环境问题的日益突出,清洁能源转型成为全球共同关注的话题。中国作为全球最大的能源消费国,也在积极推动能源结构的优化和清洁能源的发展。鼎鑫鸿鄴新能源科技有限公司在推动清洁能源转型方面制定了一系列…...
Qt下实现支持多线程的单例模式
Qt下实现支持多线程的单例模式 Chapter1 Qt下实现支持多线程的单例模式($$$)1. 代码介绍2. 代码之路3. 详细分析3.1 什么是单例3.2 如何让类无法实例化3.3 如何调用这个唯一实例3.4 如何支持多线程3.5 如何解决内存泄漏 4. 结束语 Chapter2 Qt 全局单例类Chapter3 Qt实用技巧&a…...
基于Java的宠物商店管理系统设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding) 代码参考数据库参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…...
ArcGIS中批量mxd高版本转低版本
我们经常在给别人发ArcGIS的工程文件mxd,结果到别人那发现mxd工程文件打不开,原因是我们的arcgis版本高于别人,此时工程文件又很多,一个个转存成低版本又嫌麻烦,于是我们做了个批量mxd高版本转低版本的小工具ÿ…...
三篇论文:速览GPT在网络安全最新论文中的应用案例
GPT在网络安全领域的应用案例 写在最前面论文1:Chatgpt/CodeX引入会话式 APR 范例利用验证反馈LLM 的长期上下文窗口:更智能的反馈机制、更有效的信息合并策略、更复杂的模型结构、鼓励生成多样性和GPT类似的步骤:Conversational APR 对话式A…...
美术如何创建 skybox 贴图资源?
文章目录 目的PS手绘Panorama To CubemapPS手绘Pano2VRSkybox & Cubemap Tutorial (Maya & Photoshop)Unity 中使用 ReflectionProbe 生成 Cubemap 然后再 PS 调整PS直接手绘 cubemapBlender 导入 Panorama,然后烘焙到 cubemap,再导入unity中使用…...
【Linux 用户,用户组管理】
文章目录 什么是Linux用户和用户组用户(User)用户组(User Group) Linux用户和用户组管理命令1. 创建用户2. 删除用户3. 修改用户信息4. 创建用户组5. 将用户添加到用户组6. 用户和用户组的查询 用户和用户组管理实战 什么是Linux用…...
VS2022 C# 读取 excel 2023年
今天是2023年6月26日,我有一个excel表要读数据,然后放到winform程序来处理,网上的资料太旧,很多用不起来,试了一个可以使用,记录一下: 一、excel文件后缀需要小写。 二、用VS2022建一个winform…...
Gofile下载器深度解析:Python自动化文件获取架构设计与性能优化
Gofile下载器深度解析:Python自动化文件获取架构设计与性能优化 【免费下载链接】gofile-downloader Download files from https://gofile.io 项目地址: https://gitcode.com/gh_mirrors/go/gofile-downloader Gofile下载器是一个基于Python的高效自动化文件…...
量子机器学习对称性工程权衡:Twirlator工具解析与实战指南
1. 量子机器学习中的对称性:从理论到工程实践的权衡在量子机器学习(QML)领域,我们一直在寻找能够提升模型性能、加速训练并增强泛化能力的“银弹”。对称性,这个在经典几何深度学习(Geometric Deep Learnin…...
UE5 PhysicsControl物理动画入门:手把手教你用蓝图控制骨骼网格体(附完整配置流程)
UE5 PhysicsControl物理动画实战:从零构建骨骼动态模拟系统第一次在Unreal Engine 5的内容示例中看到角色布料自然飘动、头发随奔跑起伏的物理效果时,那种震撼感至今难忘。作为技术美术师,我们常需要在角色动画中追求这种"次世代质感&qu…...
JMeter实战:从接口测试到性能基线的全链路压测指南
1. 这不是“点点点就能跑通”的测试,而是用JMeter撬动系统稳定性的杠杆很多人第一次打开JMeter,以为它就是个“高级版Postman”:填URL、选方法、点执行,看到Response里有JSON就松一口气——“接口通了,测试完了”。我带…...
ARM SVE2 STNT1H指令:非临时存储优化技术详解
1. ARM SVE指令集与STNT1H指令概述在现代处理器架构中,向量处理技术已经成为提升计算性能的关键手段。作为ARMv9架构的重要组成部分,可扩展向量扩展(Scalable Vector Extension, SVE)指令集通过引入可变长度的向量寄存器,为高性能计算应用提供…...
基于大语言模型的表位智能设计与筛选:epiGPTope项目解析
1. 项目概述与核心挑战在免疫学和生物技术领域,表位(Epitope)的发现与设计一直是一个核心且充满挑战的课题。简单来说,表位就是抗原(如病毒、细菌表面的蛋白质)上那一小段能被我们免疫系统(抗体…...
2026年上海AI Agent智能体开发公司全景解析:从技术底座到产业落地的能力坐标
引言:先把结论放在这里。2026年的上海,AI Agent智能体早已不是概念展厅里的抽象模型,而是直接进入业务流程、改写生产力公式的现实工具。面对“上海AI Agent智能体开发公司哪家好”或者“上海智能体软件开发公司推荐”这类问题,很…...
AlphaEvolve:LLM与进化算法融合的自动代码优化系统
1. 项目概述:AlphaEvolve系统架构与核心思想AlphaEvolve代表了当前算法自动优化领域最前沿的技术突破。这个由Google DeepMind团队开发的系统,创造性地将大语言模型(LLM)的代码生成能力与进化算法的迭代优化机制相结合,形成了一个自主进化的编…...
Windows下玩转NVMe:除了Identify,用Intel MAS命令行还能做这些高级操作
Windows下NVMe高级管理:Intel MAS命令行工具实战指南对于追求极致存储性能的技术爱好者而言,NVMe SSD早已成为标配。但大多数人仅停留在基础使用层面,未能充分挖掘这些高速存储设备的潜力。本文将带你探索Intel Memory and Storage Tool&…...
如何在macOS上快速创建PDF文件:终极虚拟打印机解决方案
如何在macOS上快速创建PDF文件:终极虚拟打印机解决方案 【免费下载链接】RWTS-PDFwriter An OSX print to pdf-file printer driver 项目地址: https://gitcode.com/gh_mirrors/rw/RWTS-PDFwriter 想要在macOS上轻松创建PDF文件吗?RWTS PDFwriter…...
