news 2026/7/13 15:34:26

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

作者头像

张小明

前端开发工程师

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/7/13 7:17:16

告别信息传递繁琐步骤!批量查询+手机条形码一键发,1次搞定全传递

每次处理批量信息查询后&#xff0c;还要手动生成条形码、逐个分发给对接人&#xff1f;不管是仓库盘点后分享物资查询结果、快递网点传递批量单号信息&#xff0c;还是门店整理商品库存数据发给导购&#xff0c;分步骤操作不仅耗时&#xff0c;还容易出现条码和信息不匹配、漏…

作者头像 李华
网站建设 2026/7/12 8:01:33

TinyMCE6处理站群平台word文档转存

企业网站后台Word/公众号内容导入功能集成项目记录 1. 项目需求分析 作为广西某集团公司的项目负责人&#xff0c;我们近期需要为企业网站后台管理系统的文章发布模块增加以下功能&#xff1a; 核心需求&#xff1a; Word粘贴功能&#xff1a;支持从Word复制内容粘贴到编辑…

作者头像 李华
网站建设 2026/7/12 11:44:58

2025.12.13少年宫mqtt舵机实验教程

内容1组装部分所需材料将上述零件卡在底板中。用两个螺丝拧紧&#xff0c;注意螺丝孔位与上图保持一致。将一个舵机与该零件合并倒扣在底板上加螺丝拧紧、将与上图相同的三角零件按照该方式用螺丝拧紧效果如图另一半相同将顶板卡在第二个舵机上然后如此卡在之前的安装的部件中然…

作者头像 李华
网站建设 2026/7/13 11:13:13

Python毕业设计题目:基于机器学习的校园二手物品交易平台设计与实现

一、项目背景与意义随着高校学生流动性增强&#xff0c;闲置书籍、电子产品、生活用品等二手物品堆积问题日益突出。一方面&#xff0c;学生希望快速处置闲置物品回笼资金&#xff1b;另一方面&#xff0c;新生或有需求的学生渴望以低价获取高性价比物品。传统线下交易模式存在…

作者头像 李华
网站建设 2026/7/12 22:17:33

山楂莓矮砧密植:水肥一体化系统的铺设要点指南

认识山楂莓矮砧密植山楂莓矮砧密植&#xff0c;简单来说就是选用矮化品种&#xff08;Dwarf variety&#xff09;&#xff0c;通过科学增加种植密度来提高产量的创新栽培模式。就像在有限的果园空间里&#xff0c;巧妙布局更多果树&#xff0c;让每寸土地都释放最大潜能。这种栽…

作者头像 李华
网站建设 2026/7/11 16:28:56

移动应用开发实验室25级期末考核

文章目录一、 链表的基本操作创建英雄节点类创建英雄节点类插入节点通过姓名查看熟练度通过姓名删除信息通过姓名修改英雄稀有度将链表保存到文件从文件中读出信息并以链表形式储存说说你理解的大小端&#xff0c;现代电脑一般是大端存储还是小端存储&#xff1f;文件操作中“流…

作者头像 李华