news 2026/6/15 18:34:05

【算法题】滑动窗口(一)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【算法题】滑动窗口(一)

滑动窗口是处理子串/子数组问题的经典双指针技巧,核心是通过维护一个“窗口”(左右指针界定的区间),动态调整窗口范围来满足题目条件,从而高效求解问题。

一、无重复字符的最长子串

题目描述:
给定一个字符串s,找出其中不含有重复字符的最长子串的长度。

示例

  • 输入:s = "abcabcbb",输出:3(最长子串为"abc"
  • 输入:s = "bbbbb",输出:1(最长子串为"b"

解题思路:
用滑动窗口维护“无重复字符的子串”,配合哈希数组记录字符出现次数:

  1. 定义窗口左右指针leftright,哈希数组hash[128]统计窗口内字符出现次数。
  2. 右指针right遍历字符串,将当前字符加入窗口并更新出现次数。
  3. 若当前字符出现次数超过1(窗口内有重复),移动左指针缩小窗口,直到无重复。
  4. 每次调整后,更新最长子串长度。

完整代码:

classSolution{public:intlengthOfLongestSubstring(string s){inthash[128]={0};intret=0;for(intleft=0,right=0;right<s.size();right++){hash[s[right]]++;while(hash[s[right]]>1){hash[s[left++]]--;}ret=max(ret,right-left+1);}returnret;}};

复杂度分析:

  • 时间复杂度:O(n)O(n)O(n),每个字符最多被左右指针各遍历一次。
  • 空间复杂度:O(1)O(1)O(1),哈希数组大小固定(128个ASCII字符)。

二、长度最小的子数组

题目描述:
给定含n个正整数的数组和正整数target,找出总和≥target的长度最小的子数组,返回其长度;若不存在则返回0

示例

  • 输入:target = 7, nums = [2,3,1,2,4,3],输出:2(子数组[4,3]

解题思路:
用滑动窗口维护“总和≥target的子数组”,动态缩小窗口找最小长度:

  1. 定义窗口左右指针leftright,变量sum记录窗口内元素和。
  2. 右指针right遍历数组,累加元素和到sum
  3. sum ≥ target,尝试移动左指针缩小窗口(同时更新最小长度),直到sum < target
  4. 遍历结束后,若未找到符合条件的子数组则返回0

完整代码:

classSolution{public:intminSubArrayLen(inttarget,vector<int>&nums){intsum=0,len=INT_MAX;for(intleft=0,right=0;right<nums.size();right++){sum+=nums[right];while(sum>=target){len=min(len,right-left+1);sum-=nums[left++];}}returnlen==INT_MAX?0:len;}};

复杂度分析:

  • 时间复杂度:O(n)O(n)O(n),每个元素最多被左右指针各遍历一次。
  • 空间复杂度:O(1)O(1)O(1),仅用常数级额外变量。

三、最大连续1的个数 III

题目描述:
给定二进制数组nums和整数k,最多可以翻转k0,返回操作后数组中连续1的最大个数。

示例

  • 输入:nums = [1,1,1,0,0,0,1,1,1,1,0], k = 2,输出:6(翻转后最长子数组为[1,1,1,0,0,1,1,1,1,1]

解题思路:
用滑动窗口维护“最多包含k0的子数组”(即允许翻转k0后的连续1区间):

  1. 定义窗口左右指针leftright,变量zeros统计窗口内0的个数。
  2. 右指针right遍历数组,遇到0zeros++
  3. zeros > k,移动左指针缩小窗口,直到zeros ≤ k
  4. 每次调整后,更新最长子数组长度。

完整代码:

classSolution{public:intlongestOnes(vector<int>&nums,intk){intret=0;for(intleft=0,right=0,zeros=0;right<nums.size();right++){if(nums[right]==0)zeros++;while(zeros>k){if(nums[left++]==0)zeros--;}ret=max(ret,right-left+1);}returnret;}};

复杂度分析:

  • 时间复杂度:O(n)O(n)O(n),每个元素最多被左右指针各遍历一次。
  • 空间复杂度:O(1)O(1)O(1),仅用常数级额外变量。

四、将x减到0的最小操作数

题目描述:
给定整数数组nums和整数x,每次操作移除数组最左或最右元素并从x中减去该元素值,要求将x恰好减到0,返回最小操作数;否则返回-1

示例

  • 输入:nums = [1,1,4,2,3], x = 5,输出:2(移除后两个元素2+3=5

解题思路:
转化问题:“最小操作数”等价于“数组中最长的、和为sum(nums)-x的子数组”(因为移除的元素是数组两端,剩余的中间子数组和为sum-x)。

  1. 计算数组总和sum,目标子数组和为target = sum - x(若target < 0,直接返回-1)。
  2. 用滑动窗口找最长的、和为target的子数组。
  3. 若找到该子数组,最小操作数为数组长度 - 子数组长度;否则返回-1

完整代码:

classSolution{public:intminOperations(vector<int>&nums,intx){intsum=0;for(auton:nums)sum+=n;inttarget=sum-x;if(target<0)return-1;intret=-1;for(intleft=0,right=0,tmp=0;right<nums.size();right++){tmp+=nums[right];while(tmp>target)tmp-=nums[left++];if(tmp==target)ret=max(ret,right-left+1);}returnret==-1?-1:nums.size()-ret;}};

复杂度分析:

  • 时间复杂度:O(n)O(n)O(n),每个元素最多被左右指针各遍历一次。
  • 空间复杂度:O(1)O(1)O(1),仅用常数级额外变量。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 15:23:41

Office Tool Plus v10.29.50 office安装激活一条龙

&#x1f51e;简介:Office Tool Plus是一款相当牛逼的office安装工具&#xff0c;并且安装完了顺带激活&#xff0c;也可以很快捷的卸载office清除激活信息等等。下载最新的office2016免去那么多的麻烦&#xff0c;反方便~【下载地址】&#xff1a;链接&#xff1a;https://dri…

作者头像 李华
网站建设 2026/6/15 11:22:12

锁、互斥、阻塞、自旋、CAS、可见性

今天的目标是&#xff1a;从 OS 视角理解“为什么必须有锁”、“为什么会出现竞态”、“锁为什么能解决”、“CAS 的本质是什么”。这一层是并发编程最容易混乱的地方&#xff0c;因为它跨越&#xff1a;OS 调度&#xff08;Day3&#xff09;CPU 缓存一致性&#xff08;你之前学…

作者头像 李华
网站建设 2026/6/15 15:37:48

Pr 如何批量修改字幕?字体、大小统一调整的方法来了!

在剪辑圈里&#xff0c;统一字幕样式一直是让人头疼的环节。 很多专业剪辑师都吐槽&#xff1a;明明只是几十条字幕&#xff0c;结果改字体、调字号、调描边、调位置……每一个都得点开单独修改。遇到访谈类、讲解类视频&#xff0c;字幕数量动不动上百条&#xff0c;效率直接被…

作者头像 李华
网站建设 2026/6/15 12:55:41

基于java的SpringBoot/SSM+Vue+uniapp的篮球管理系统的详细设计和实现(源码+lw+部署文档+讲解等)

文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言 &#x1f31e;博主介绍&#xff1a;✌全网粉丝15W,CSDN特邀作者、211毕业、高级全…

作者头像 李华
网站建设 2026/6/15 9:53:41

TinyMCE4支持信创系统word粘贴兼容

企业级文档导入与粘贴方案设计 项目需求分析 作为四川某国企项目负责人&#xff0c;我们面临着企业网站后台管理系统升级的需求&#xff0c;具体需要实现以下功能&#xff1a; Word粘贴功能&#xff1a;支持从Word复制内容粘贴到网站编辑器&#xff0c;自动上传图片Word文档…

作者头像 李华