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

【优选算法】滑动窗口专项:1.长度最小的子数组 2.无重复最长子串

🔥小龙报:个人主页
🎬作者简介:C++研发,嵌入式,机器人,AI等方向学习者
❄️个人专栏:《优选算法》
永远相信美好的事情即将发生

文章目录

  • 前言
  • 一、长度最小的子数组
    • 1.1题目
    • 1.2 算法原理
    • 1.3 代码
  • 二、无重复最长子串
    • 2.1 题目
    • 2.2 算法原理
    • 2.3 代码
  • 总结与每日励志

前言

滑动窗口是数组、字符串高频考点,依靠同向双指针规避暴力枚举的双层循环,将时间复杂度优化至 O (n)。本文选取两道经典例题拆解思路:和大于目标值的最短子数组、无重复最长子串。分别讲解纯滑动窗口、哈希数组搭配窗口的两种模板,清晰拆解进窗、校验、出窗流程,附上可直接提交的 C++ 完整代码,帮助快速掌握窗口边界控制逻辑,适配各类同类型刷题场景。


一、长度最小的子数组

1.1题目

链接:长度最小的子数组

1.2 算法原理

核心思想:单调性同向双指针

我们「暴力枚举」的过程中,固定⼀个起点位置left,然后之后right向后遍历时。当right第一次扫描到⼀个位置,使[left,right]这个区间大于等于target,此时我们会发现:
• right 无需再向后遍历,因为继续向后走区间窗口也是「不合法」的;
• left向后移动一格之后,right 指针也不用回退,因为我们已经维护出来[left,right]区间的信息,并且以left + 1 为起点的最优解一定不会比left为起点的好
当我们发现暴力枚举的「两个指针不回退」时,就可以用「滑动窗口」优化
(1)进窗口:right 位置元素记录到sum中;
(2)判断:当sum >= target之后,窗口内子串合法,并更新结果;
(3)出窗口:让left 所指位置的元素在sum中的减去nums[l];

1.3 代码

classSolution{public:intminSubArrayLen(inttarget,vector<int>&nums){intl=0,r=0,n=nums.size();intsum=0,len=1e6+10;while(r<n){//进窗口sum+=nums[r];//判断while(sum>=target){len=min(len,r-l+1);sum-=nums[l++];//出窗口}r++;}returnlen==1e6+10?0:len;}};

时间复杂度: O(n)

二、无重复最长子串

2.1 题目

链接:无重复最长子串

2.2 算法原理

核心思想:哈希表 + 同向双指针
定义一个数组h记录当前窗口内统计到字符种类
(1)进窗口:right位置元素记录到统计次数的哈希表中,如果次数是0 变1 ,说明窗口内多了「⼀种」字符,记录⼀下;
(2)判断:当窗口内字符种类大于1时,窗口不合法,right 停止右移(寻找到当前情况的最优解),接下来需要出窗口;
(3)出窗口:让left 所指位置的元素在哈希表中的次数减一,如果次数是1 变0 ,说明窗口内少了「一种」字符,记录一下;
(4)更新结果:在判断未成立时,窗口合法,此时更新窗口大小

2.3 代码

classSolution{public:intlengthOfLongestSubstring(string s){inth[128]={0};//用数组模拟哈希表intl=0,r=0,n=s.size();intret=0;while(r<n){h[s[r]]++;//进窗口while(h[s[r]]>1)//判断 + 出窗口(此时窗口非法)h[s[l++]]--;ret=max(ret,r-l+1);//更新合法窗口的结果r++;}returnret;}};

时间复杂度: O(N)

总结与每日励志

✨两道例题完整覆盖滑动窗口核心逻辑,关键在于利用单调性保证指针只前进不回退,搭配数组哈希快速统计字符频次。刷题时牢记三步模板:右指针扩张窗口,满足条件就收缩左边界,实时更新最优答案。算法学习贵在坚持,不必畏惧复杂逻辑,逐题吃透模板、勤加练习就能稳步提升。永远相信日积月累的力量,持续深耕,所有努力终会兑现,美好结果正在路上等候。

http://www.jsqmd.com/news/1189072/

相关文章:

  • Chinese-Poetry:52K Star 的中文诗词宝库,AI 时代的文化基建
  • 2026 北京二手包包变现避坑指南,7 月实时行情零折旧计价 - 生活时报
  • Video2X完整指南:用AI让老旧视频重获新生的终极方案
  • Parasoft C/C++test并发性能优化实战:从原理到配置调优
  • 拷贝构造与赋值:浅拷贝vs深拷贝,面试里最容易踩的坑
  • 深度复盘:环氧地坪漆公司哪家好?奥伯特给出硬核答案 - 变量人生001
  • C++组合模式实战:统一处理树形对象结构的设计艺术
  • 3步锁定专业成都厨卫翻新装修公司 从筛选到签约 - 信息热点
  • 宝珀中国官方售后服务中心|官方地址及联系电话权威信息通知(2026年7月更新) - 宝珀官方售后服务中心
  • 【深度测评】济南爱马仕香奈儿包包回收行情 2026 最新估价标准 - 讯息早知道
  • Debian12网卡配置:桥接与Host-Only模式详解
  • Redisson实战:Redis客户端选择与分布式锁优化
  • 华为OD机试真题 新系统 2026-07-08 C++ 实现【计算碳排放减少量】
  • machine 孔与轴的极限偏差数值(GB/T1800.4-1999)
  • 如何为《恋活!》游戏安装HF Patch:5分钟解锁完整游戏体验的终极指南
  • 软件设计师冲刺:核心考点速记与实战联想
  • OpenCV斑点检测原理与工业视觉应用实践
  • 2026 乳胶床垫全维度实测:10 大品牌横向对比,制造型高性价比品牌差异化解析 - 信息热点
  • 内容7 内存管理 1​​
  • 苏州手表回收攻略|全城正规门店渠道,估价实操技巧,避坑兜底一站式变现 - 生活时报
  • STM32F215RE与ADS131M02高精度数据采集方案详解
  • 2026年7月最新深圳万国官方售后服务热线与网点地址查询 - 万国中国官方服务中心
  • 2026 广告媒介采购行业发展观察:标准化直采平台规范企业营销投放链路
  • 虚竹哥与北京大学出版社免费送AI书活动第七期:《具身智能机器人开发全解》
  • 基于ADC12DJ5200SE的宽带射频采样接收机设计实战指南
  • LangChain 多任务应用实战案例
  • Windows C盘清理教程:安全释放数十GB空间的系统优化指南
  • YJD-06A/B 星型卸料器 300*300 方口国标法兰——河北九阳除尘自产耐磨防卡卸料器技术解析与企业能力白皮书 - 品牌优选官
  • YOLOv11架构改进:MFM与LEGM模块详解
  • PD分离+弹性伸缩/角色切换的实践笔记