当前位置: 首页 > article >正文

算法篇:滑动窗口

使用范围此方法针对的对象是一段连续的区间。做题模板区分子数组/子串、子序列、子集子数组/子串是原数组中连续的一段区间要求保持顺序也要求连续。子序列是原数组中删除若干元素后剩下的序列不要求保持顺序要求连续。子集是从原来集合中任意选取一些元素不要求保持顺序也不要求连续。举例说明对于数组 [1, 2, 3, 4]子数组[1,2]、[2,3,4]、[3]、[1,2,3,4]注意[1,3] 不是子数组不连续子序列[1,3]、[2,4]、[1,2,4]、[1,2,3,4]注意[2,1] 不是子序列顺序改变子集{1,3}、{2,4}、{1,2,4}、{1,2,3,4}注意{2,1} 和 {1,2} 是同一个子集顺序无关题目实例长度最小的子数组209. 长度最小的子数组 - 力扣LeetCode子数组为一段连续的区间可以考虑用滑动窗口的方法解答这个问题。解题思路该题目需要我们找的是总和大于等于target的最小长度的子序列。根据总和我们可以定义一个sum变量来实现进窗口当加到总和大于等于target的时候可以进行更新结果最后在出窗口进行后面数组的判断。class Solution { public: int minSubArrayLen(int target, vectorint nums) { int left0,right0; int nnums.size(); int sum0,minlenINT_MAX; for(;rightn;right) { sumnums[right]; while(sumtarget) { minlenmin(minlen,right-left1); sum-nums[left]; left; } } return minlenINT_MAX?0:minlen; } };注时间复杂度虽然代码是两层循环但是我们的 left 指针和 right 指针都是不回退的两者最多都往后移动 n 次。因此时间复杂度是 O(N) 。无重复字符的最长子串3. 无重复字符的最长子串 - 力扣LeetCode子串为一段连续的区间可以考虑用滑动窗口的方法解答这个问题。解题思路哈希表滑动窗口记得维护哈希表右端元素进入窗口时用哈希表统计元素个数根据题意:不含重复的字符这表明这段连续区间内每个元素都只有一个那么我们就可以得到我们出窗口的条件只要有一个元素在这段区间内超过1了就对该区间进行出窗口直到该区间内无重复元素时对它进行更新结果。class Solution { public: int lengthOfLongestSubstring(string s) { int hash[128]{0}; int left0,right0; int maxlen0; for(;rights.size();right) { char chs[right]; hash[ch]; while(hash[ch]1) { char rets[left]; hash[ret]--; left; } maxlenmax(maxlen,right-left1); } return maxlen; } };当只有小写字母或者大写字母时哈希表只用hash[26];当不止一种且都是ASCII中的元素时哈希表用hash[128]。最大连续 1 的个数 III1004. 最大连续1的个数 III - 力扣LeetCode根据题意求取在一段区间内把里面的k个0变成1后数组中连续1的最大个数即求取连续区间内最大个数的1k的最大个数。解题思路用一个变量count来统计0在区间内出现的个数根据题目最多可以反转k个0可以得出出窗口的条件countk,在出窗口的时候记得维护count变量。出窗口后更新结果。class Solution { public: int longestOnes(vectorint nums, int k) { int count0; int left0,right0; int maxnum0; for(;rightnums.size();right) { //for循环中right已经是进窗口了 if(nums[right]0) { count; } //出窗口 while(countk) { if(nums[left]0) { count--; } left; } //更新结果 maxnummax(maxnum,right-left1); } return maxnum; } };将 x 减到 0 的最小操作数1658. 将 x 减到 0 的最小操作数 - 力扣LeetCode题意移除最左边或最右边的数使移除的数等于x转换思维题目中移除的是最右边或最左边的数是不是只要保证中间的区域只要等于全部数的总和-x就行了所以我们就转换求结果等于sum-x的最长子数组最后用总长减最长子数组即可。解题思路根据思路我们可以在数组中找一段连续的区间等于sum-x即可解题方法如第一道题一样相当于这个题目的targetsum-x但是更新结果和出窗口的位置不一样。这题是要在总和等于sum-x的时候更新结果而出窗口的提交条件是区间中的和加起来大于target所以不能在出窗口的时候更新结果出完窗口后我们才能更新结果。细节问题这里我们求的是最长的子数组但是定义最长子数组长度的值不能初始化为0因为当数组中全部数都大于x的时候最长子数组的长度为0而整个数组的和为x的时候最长子数组长度的和也为0但是第一种输出的结果为-1第二个输出的是数组的长度。class Solution { public: int minOperations(vectorint nums, int x) { //求取中间连续区间的值等于总和-x long long sum0; for(auto s:nums) { sums; } if(sumx) { return -1; } int left0,right0; int maxnum-1; long long ret0; long long targetsum-x; for(;rightnums.size();right) { retnums[right]; while(rettarget) { //出窗口 ret-nums[left]; left; } if(rettarget) maxnummax(maxnum,right-left1); } return maxnum-1?-1:nums.size()-maxnum; } };水果成篮904. 水果成篮 - 力扣LeetCode题意解析一共有两个篮子每个篮子只能放同一种水果也就是数组中数字一样的例如fruits [1,2,3,2,2] 这个数组中有三种水果分别是123.解题思路哈希表滑动窗口进窗口把右端的值放入到哈希表中哈希表中统计每个水果的个数。出窗口题目中的限制条件是两个篮子那么两个篮子就可以设置成出窗口的条件。更新结果更新最大数目哈希表可以用两种形式的unordered_mapint,inthash,int hash[100001]{0};如果用unordered_map这种容器的哈希表记得元素的个数为0的时候要删除元素。int totalFruit(vectorint fruits) { unordered_mapint,inthash; int left0,right0,nfruits.size(); int maxlen-1; for(;rightn;right) { hash[fruits[right]]; while(hash.size()2) { //出窗口 hash[fruits[left]]--; if(hash[fruits[left]]0) { hash.erase(fruits[left]); } left; } maxlenmax(maxlen,right-left1); } return maxlen; } };class Solution { public: int totalFruit(vectorint fruits) { int hash[100001]{0}; int left0,right0,nfruits.size(); int maxlen-1; int count0;//水果的种类 for(;rightn;right) { if(hash[fruits[right]]0) { count; } while(count2) { //出窗口 hash[fruits[left]]--; if(hash[fruits[left]]0) { count--; } left; } maxlenmax(maxlen,right-left1); } return maxlen; } };找到字符串中所有字母异位词438. 找到字符串中所有字母异位词 - 力扣LeetCode求的是子串子串是一段连续的区间可以考虑滑动窗口。解题思路哈希滑动定义一个变量来统计在s中有多少符合p个数的字符串count还定义两个哈希表一个哈希表hash1来统计p中所有个数一个哈希表hash2来统计s中所有个数,这三个变量都是在接下来的解题中需要维护的。进窗口把s中的字符统计的同时维护count变量统计有多少个符合p个数的字符串可以通过hash2[s[right]]hash1[s[right]]统计。出窗口如果用countright-left1来作为出窗口的条件的话那么就只是表明在这个数组中right-left1这一段里面没有连续的符合p的子串而且这个条件也不能判断count是不是等于p.size()所以这个不能作为判断条件。判断要和p的大小有关而且要符合长度所以用right-left1p.size()作为判断条件。出窗口时我们要维护count变量hash2变量和left变量。更新结果判断条件countp.size()class Solution { public: vectorint findAnagrams(string s, string p) { //哈希滑动 unordered_mapchar,inthash1; unordered_mapchar,inthash2; vectorint result; for(auto s:p) { hash1[s]; } int left0,right0; int count0;//符合的个数 for(;rights.size();right) { char chs[right]; if(hash2[ch]hash1[ch])count; while(right-left1p.size()) { //出窗口 char is[left]; if(hash2[i]--hash1[i])count--; left; } if(countp.size()) { result.push_back(left); } } return result; } };串联所有单词的子串30. 串联所有单词的子串 - 力扣LeetCode题意解析找到数组中一段包含words中所有单词的连续区间单词的顺序可以任意。连续区间可以考虑用滑动窗口。关键信息words中所有字符串长度一样。解题思路把数组分割成words中单词长度的大小但是我们怎么知道要从哪里开始分割才能遇到words中的单词呢这时候我们就需要一个循环这里可以优化但我们循环超过words字符串长度一样的时候发现和从0开始遍历的单词是一样的了所以我们可以缩小循环次数在单词长度之间。这题上题解题类似只是把字符看成字符串就行。细节部分count的变量应该放在循环里遍历字符串s的哈希表也要放在循环里不然哈希表每次遍历都不是新的结果。class Solution { public: vectorint findSubstring(string s, vectorstring words) { unordered_mapstring, int hash1; vectorint result; for (auto s : words) { hash1[s]; } int left 0, right 0; int m words[0].size(); for (int i 0; i m; i) { int count 0; unordered_mapstring, int hash2; for (righti,lefti; right s.size(); right m) { string rs s.substr(right, m); if (hash2[rs] hash1[rs]) { count; } while (right - left 1 m * words.size()) { string ls s.substr(left, m); if (hash2[ls]-- hash1[ls]) { count--; } left m; } if(words.size()count) { result.push_back(left); } } } return result; } };最小覆盖子串76. 最小覆盖子串 - 力扣LeetCode题目解析寻找一段连续区间中只要包含t中所有的字符的最短子串即最短子串中可以存在其他字符但是一定要全部包含t中所有的字符。解题思路和找到字符串中所有字母异位词的解题思路一样但是这题要求的是返回字符串。进窗口遍历右端元素进入哈希表出窗口根据题意寻找的是最短的子串那么也就是说最好最后一个结尾的就是t元素中包含的全部字符的最后一个字符所以这里的出窗口的条件就是当区间内刚好countt.size()。这个时候就是刚好符合题目的要求所以我们要在出窗口前更新结果而题目返回的是字符串那么我们可以通过string容器中的substr函数来进行结果返回sustr有两个参数一个是起始位置一个是截取多少个字符所以我们要定义两个变量来记录。细节部分begin设置为-1记录子串起始位置的值返回的时候要对begin进行判断。class Solution { public: string minWindow(string s, string t) { unordered_mapchar,inthash1; for(autoch:t) { hash1[ch]; } int left0,right0; int minlenINT_MAX; int count0; int begin-1; unordered_mapchar,inthash2; for(;rights.size();right) { if(hash2[s[right]]hash1[s[right]])count; //出窗口 while(countt.size()) { if(minlenright-left1) { minlenmin(minlen,right-left1); beginleft; } if(hash2[s[left]]--hash1[s[left]])count--; left; } } if(begin-1) return ; else return s.substr(begin,minlen); } };

相关文章:

算法篇:滑动窗口

使用范围 此方法针对的对象是一段连续的区间。 做题模板: 区分子数组/子串、子序列、子集 子数组/子串是原数组中连续的一段区间,要求保持顺序,也要求连续。 子序列是原数组中删除若干元素后剩下的序列,不要求保持顺序&#x…...

STM32 SDIO/SDMMC硬件驱动深度解析与工业存储实践

1. STM32duino STM32SD 库深度解析:面向工业级 SD 卡存储的底层驱动工程实践1.1 库定位与核心价值STM32duino STM32SD 是专为 STM32 系列微控制器设计的高性能 SD 卡驱动库,其核心价值在于直接利用 STM32 芯片原生 SDIO/SDMMC 硬件外设,而非通…...

向日葵发布2026年GEO优化免费攻略:专业服务驱动企业搜索排名效率革命

发布日期:2025年10月15日 记者:张明 | 数字营销前沿报道 在当今竞争激烈的数字环境中,企业正面临一个关键挑战:如何以高效、经济的方式提升本地化搜索排名,尤其是在GEO优化领域。随着2026年的临近,行业专家…...

AList+RaiDrive实战:5分钟把阿里云盘变成电脑本地硬盘(附开机自启技巧)

AListRaiDrive深度实战:将阿里云盘无缝整合为本地存储的完整指南 1. 云存储本地化的技术原理与优势 在数字化时代,数据存储需求呈现爆炸式增长,传统本地硬盘的容量限制与云存储的访问延迟成为用户面临的双重挑战。AListRaiDrive的组合方案通过…...

COMSOL电磁超声仿真:L型铝板裂纹检测的电磁超声测量技术

COMSOL电磁超声仿真: Crack detection in L-shaped aluminum plate via electromagnetic ultrasonic measurements"啪嗒"一声点击鼠标,模型库里那个L型铝板突然裂了条缝——当然,这只是我今早在COMSOL里建的仿真模型。要说电磁超声检测裂纹这事…...

qgis与qt开发基于vs环境搭建(傻瓜式教程)

嗯,本人因为工作需要所以耗费一些事件摸索着如何搭建这个环境,感觉网上的资料不多,自己找起来也很麻烦,因为是第一次本人踩了不少坑,所以留下这个搭建教程,希望能帮助一些人。 一 正文 进入qgis下载官网…...

嵌入式C语言宏定义工程实践与安全规范

1. 嵌入式C语言宏定义的工程实践方法论在嵌入式系统开发中,C语言宏定义远非简单的文本替换工具。它是一把双刃剑:用得精妙,可显著提升代码健壮性、可移植性与可维护性;用得随意,则极易引入难以调试的隐蔽缺陷。本文基于…...

Neeshck-Z-lmage_LYX_v2落地实操:LoRA权重训练数据溯源与版权管理

Neeshck-Z-lmage_LYX_v2落地实操:LoRA权重训练数据溯源与版权管理 1. 项目简介与核心价值 今天我们来聊聊一个非常实用的本地AI绘画工具——Neeshck-Z-lmage_LYX_v2。如果你对AI绘画感兴趣,但又觉得在线服务限制多、隐私没保障,或者想更自由…...

Python学生作业

Python代码1,。勾股定理import math #import语句,用于导入math语句 a float(input("请输入直角三角形的直角边1)>0);")) #赋值语句,输入直角三角形的边长1,并转换为float数…...

出一次规划垂直泊车路径规划matlab代码。 回旋曲线对泊车路径进行优化,图片仅供参考

出一次规划垂直泊车路径规划matlab代码。 回旋曲线对泊车路径进行优化,图片仅供参考停车是门技术活,尤其是垂直泊车时方向盘该打几度、什么时候回正,老司机都得掂量掂量。今天咱们用Matlab整点有意思的——用回旋曲线生成丝滑的泊车路径&…...

OpenClaw学术助手:ollama-QwQ-32B自动整理参考文献

OpenClaw学术助手:ollama-QwQ-32B自动整理参考文献 1. 为什么需要自动化文献管理 作为经常需要阅读大量论文的研究者,我长期被文献管理问题困扰。每次写论文时,最头疼的不是内容创作,而是整理几十篇参考文献的元数据、摘要和引用…...

压缩空气储能系统及其释能阶段模型研究及仿真程序编写——附相关文档文献

压缩空气储能和释能阶段模型,附相关文档文献。 建立了压缩空气储能系统中的压缩机、换热器、储气罐、透平、热水罐等设备的数学模型、 并在 Simulink仿真平台上、 按模块化建模方式完成了系统相关程序编写和仿真模型建立、 包含储能和释能两个阶段的模型。压缩空气储…...

Qwen3模型CSDN技术博客助手:从思路到排版的全流程辅助

Qwen3模型CSDN技术博客助手:从思路到排版的全流程辅助 写技术博客,尤其是那种需要配图、贴代码、讲原理的深度文章,对很多开发者来说是个不小的挑战。我见过不少朋友,技术实力很强,但一坐到电脑前准备写文章&#xff0…...

day 57 图论part9

文章目录dijkstra(堆优化版)精讲 47. 参加科学大会(第六期模拟笔试)Bellman_ford 算法精讲 94. 城市间货物运输 Idijkstra(堆优化版)精讲 47. 参加科学大会(第六期模拟笔试) 加入小…...

SEO_避开这些常见误区,让你的SEO效果事半功倍

SEO误区一:忽视关键词优化在SEO优化过程中,忽视关键词优化是一个常见的误区。许多网站主认为,只要内容好,自然就能被搜索引擎收录和排名。关键词优化是SEO的核心。关键词不仅决定了你的网站在搜索结果中的位置,还直接影…...

3种场景部署开源测速平台:从个人到企业的全方案指南

3种场景部署开源测速平台:从个人到企业的全方案指南 【免费下载链接】speedtest Self-hosted Speed Test for HTML5 and more. Easy setup, examples, configurable, mobile friendly. Supports PHP, Node, Multiple servers, and more 项目地址: https://gitcode…...

从零开始:用汇编语言打造你的第一个图形界面操作系统(附完整代码)

从零构建图形界面操作系统:汇编语言的魔法之旅 当屏幕第一次亮起蓝色背景和黄色矩形时,那种成就感就像在数字荒漠中建造出了第一座城堡。这不是用现成的框架堆砌的产物,而是从最底层的机器指令开始,用汇编语言一点一滴构建的图形世…...

收藏!小白程序员必看:用MCP解锁AI Agent自动化操作新时代

文章介绍了AI Agent的发展现状与MCP(模型上下文协议)技术,阐述MCP如何使AI大模型能与外部工具交互,自动化完成复杂任务。通过对比传统API调用方式,MCP在灵活性、效率上优势明显。文章还提供了MCP的安装和使用教程&…...

Qt纯实现图片处理工具:支持多形态绘制、自适应缩放与背景图功能

Qt实现的包含图片显示功能、自适应缩放、背景图片、画roi工具。 不依赖其他库纯Qt实现。 在图片上可以画矩形、矩形旋转、圆形、同心圆、多边形、直线、卡尺、锚点、清空。 源码: 使用Qt5.6.1_MinGW、Qt5.15.1_MinGW、Qt5.15.1_msvc编译通过,其他版本请自…...

Can协议(一)

CAN设备(如CAN盒)上常见的 ‌PWR(Power)‌、‌ERR(Error)‌ 和 ‌CAN‌ 三个指示灯,其含义如下: 1.PWR(电源指示灯)‌ PWR是电源指示灯,表示设备是…...

SSD1308 OLED驱动库:I²C接口128×64单色屏嵌入式实战指南

1. SSD1308_128x64_I2C 驱动库深度解析:面向嵌入式工程师的OLED显示系统构建指南 SSD1308_128x64_I2C 是一款专为嵌入式平台设计的轻量级、高可靠性 OLED 显示驱动库,面向 SSD1308 控制器的 12864 像素单色 OLED 屏模组,采用标准 IC&#xf…...

BMP280非阻塞驱动库:嵌入式气压温度传感器实时采集方案

1. BMP280_DEV库深度解析:面向嵌入式工程师的非阻塞式气压/温度传感器驱动设计与实践1.1 库定位与核心价值主张BMP280_DEV是一个专为嵌入式系统设计的、Arduino兼容的非阻塞式BMP280传感器驱动库。其核心价值不在于简单封装IC/SPI通信,而在于提供一套可预…...

LangFlow助力内容创作:快速搭建自媒体文案生成工作流

LangFlow助力内容创作:快速搭建自媒体文案生成工作流 1. 为什么选择LangFlow进行内容创作 在当今内容爆炸的时代,自媒体创作者面临巨大的创作压力。每天需要产出大量高质量内容,同时还要保持创意和独特性。传统的人工创作方式不仅效率低下&…...

SEO_网站SEO优化全流程步骤详解与实战

SEO: 网站SEO优化全流程步骤详解与实战在当今数字化时代,网站SEO优化已经成为提升网站流量和品牌知名度的关键。无论你是一个新手,还是有一定经验的网站管理者,了解SEO全流程步骤是提升网站排名的基础。本文将详细介绍网站SEO优化的全流程步骤…...

SEO_详解SEO核心关键词研究与布局方法(86 )

SEO核心关键词研究的重要性在当今的互联网时代,搜索引擎优化(SEO)已经成为了网站提升流量和品牌知名度的重要手段之一。其中,核心关键词研究与布局是SEO的核心环节。无论你是一位新手还是资深的SEO专家,理解和掌握SEO核…...

[STM32] - 深入解析STM32CubeMX配置FatFs的SD卡驱动层:从初始化时序到错误码03的根因追踪

1. STM32CubeMX与FatFs基础配置实战 第一次用STM32CubeMX配置FatFs时,我像大多数开发者一样,以为按照默认配置勾选几个选项就能轻松搞定SD卡读写。结果在f_mount()阶段就遭遇了经典的FR_NOT_READY(错误码03),这个看似简…...

别再死磕从头训练了!用YOLO预训练模型,5分钟搞定你的自定义数据集

5分钟实战:用YOLO预训练模型高效攻克小数据集目标检测 当我在第一次尝试用YOLO训练自己的安全帽检测模型时,面对仅有300张标注图片的数据集,训练结果惨不忍睹——模型要么完全无法识别目标,要么把工地上的所有黄色物体都误判为安全…...

GLM-OCR入门教程:Python环境安装与第一个识别程序

GLM-OCR入门教程:Python环境安装与第一个识别程序 你是不是也对“让电脑看懂图片里的字”这件事感到好奇?网上那些高大上的技术文章,动不动就是一堆术语,看得人云里雾里。今天,咱们就换个方式,不讲复杂的原…...

3层架构解析:构建企业级HTML转Word文档转换系统的技术实践

3层架构解析:构建企业级HTML转Word文档转换系统的技术实践 【免费下载链接】html-to-docx HTML to DOCX converter 项目地址: https://gitcode.com/gh_mirrors/ht/html-to-docx 在数字化转型的浪潮中,文档格式转换已成为企业级应用中的核心需求之…...

手把手教你用MATLAB实现一阶RC低通滤波器(附完整代码与避坑指南)

MATLAB实战:一阶RC低通滤波器设计与工程避坑指南 1. 从理论到实践:RC低通滤波器的核心原理 在嵌入式系统和信号处理领域,RC低通滤波器是最基础却至关重要的电路单元。想象一下这样的场景:您从传感器采集的温度数据总是夹杂着高频干…...