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

发布时间:2026/7/14 19:24:58
【优选算法】滑动窗口专项: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,vectorintnums){intl0,r0,nnums.size();intsum0,len1e610;while(rn){//进窗口sumnums[r];//判断while(sumtarget){lenmin(len,r-l1);sum-nums[l];//出窗口}r;}returnlen1e610?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};//用数组模拟哈希表intl0,r0,ns.size();intret0;while(rn){h[s[r]];//进窗口while(h[s[r]]1)//判断 出窗口此时窗口非法h[s[l]]--;retmax(ret,r-l1);//更新合法窗口的结果r;}returnret;}};时间复杂度: ON总结与每日励志✨两道例题完整覆盖滑动窗口核心逻辑关键在于利用单调性保证指针只前进不回退搭配数组哈希快速统计字符频次。刷题时牢记三步模板右指针扩张窗口满足条件就收缩左边界实时更新最优答案。算法学习贵在坚持不必畏惧复杂逻辑逐题吃透模板、勤加练习就能稳步提升。永远相信日积月累的力量持续深耕所有努力终会兑现美好结果正在路上等候。