跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

滑动窗口实战:最小和子数组与最长无重复子串

滑动窗口算法是处理连续区间问题的利器。通过两道经典题——长度最小的子数组和无重复字符的最长子串,演示如何从暴力解法进阶到 O(N) 的滑动窗口方案。核心在于维护一个动态窗口,利用左右指针不回退的特性减少重复计算,配合哈希表统计频次,高效解决子串去重与求和问题。

机器人发布于 2026/3/28更新于 2026/6/517 浏览
滑动窗口实战:最小和子数组与最长无重复子串

09. 长度最小的子数组

题目链接:

209. 长度最小的子数组 - 力扣(LeetCode)

题目描述:

题目描述

题目示例:

题目示例

暴力求解

思路很直接:枚举数组中的任意一个元素作为起始位置,然后向后寻找一段最短的区间,使得这段区间的和大于等于目标值 target。遍历完所有可能的起始位置后,取其中的最小值即可。

不过这种双重循环的做法在数据量大时很容易超时,我们来看看更优的方案。

滑动窗口优化

既然问题关注的是【一段连续的区间】,滑动窗口是天然的选择。

核心思路: 维护一个窗口 [left, right],让窗口内的元素和小于 target。当窗口内元素之和第一次大于等于目标值时,记录当前长度,并尝试收缩左边界以寻找更短的有效区间。

具体做法:

  1. 扩张右边界:将右端元素纳入窗口,累加当前和。
  2. 收缩左边界:如果当前和 sum >= target,说明找到了一个满足条件的区间。此时更新结果长度,并将左端元素移出窗口(同时 sum 减去该值),继续判断是否仍满足条件。因为左边的元素可能很小,移出一个后剩下的部分依然可能满足要求。
  3. 继续扩张:如果不满足条件,则移动右指针,引入下一个元素。

为什么滑动窗口能提升效率? 很多初学者会疑惑:为什么指针不回退?

假设我们找到了从 left1 开始的最优区间,终点是 right1。既然已经确定了 left1 开头的最佳解,就没必要再保留它了。如果像暴力法那样重置指针重新计算,会浪费大量已知的信息。而滑动窗口的妙处在于,当我们把 left1 移出窗口时,right1 不需要回退,因为它已经是满足条件的最远点。新的起点 left2 对应的终点只会比 right1 更远或持平,不会更近。这样左右指针都只向右移动,总复杂度降为 O(N)。

C++ 代码实现:

class Solution {
public:
    int minSubArrayLen( target, vector<>& nums) {
         n = nums.(), sum = , len = INT_MAX;
         ( left = , right = ; right < n; right++) {
            sum += nums[right]; 
             (sum >= target) {
                len = (len, right - left + ); 
                sum -= nums[left++]; 
            }
        }
         len == INT_MAX ?  : len;
    }
};
int
int
int
size
0
for
int
0
0
// 进窗口
while
min
1
// 更新结果
// 出窗口
return
0

10. 无重复字符的最长子串

题目链接:

3. 无重复字符的最长子串 - 力扣(LeetCode)

题目描述:

题目描述

题目示例:

题目示例

暴力求解

枚举每一个位置作为起点,向后查找直到出现重复字符为止。过程中可以用哈希表统计字符频次来判断是否重复。虽然能通过测试,但效率不如滑动窗口。

滑动窗口优化

研究对象依然是连续区间,继续使用滑动窗口思想。

核心思路: 维护一个窗口,保证窗口内所有字符都是不重复的。

具体做法:

  1. 右端进入:新字符 ch 进入窗口时,在哈希表中增加计数。
  2. 检测重复:如果某个字符频次超过 1,说明窗口内有重复。此时必须收缩左边界,不断移除左侧字符,直到重复字符的频次变回 1。
  3. 更新结果:每次调整窗口后,用当前窗口长度更新最大长度 ret。

C++ 代码实现:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int hash[128] = {0}; // 数组模拟哈希表,ASCII 码范围足够
        int left = 0, right = 0, ret = 0;
        int n = s.size();
        while (right < n) {
            hash[s[right]]++; // 字符入窗口
            while (hash[s[right]] > 1) {
                hash[s[left++]]--; // 重复则左指针右移
            }
            ret = max(ret, right - left + 1);
            right++; // 右指针右移
        }
        return ret;
    }
};

总结

这两道题是滑动窗口的经典入门案例。第一题通过双指针不回退实现了 O(N) 的时间复杂度;第二题结合哈希表处理字符去重。掌握这两个模板,面对类似的连续区间问题就能快速找到突破口。

目录

  1. 09. 长度最小的子数组
  2. 暴力求解
  3. 滑动窗口优化
  4. 10. 无重复字符的最长子串
  5. 暴力求解
  6. 滑动窗口优化
  7. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • ClawX:基于 Electron 的可视化 AI 智能体开发工具
  • AI 大模型如何重构智能汽车设计与开发
  • STL 底层解析:map/set 基于红黑树的封装与迭代器实现
  • 如何在 GitHub Copilot 中使用 MCP 服务
  • YOLOv8 车牌定位模型训练与 OpenCV C++ 部署完整指南
  • C++ 转 C#:核心思维转变与实战要点
  • COMSOL 仿真在超声层析成像中的声场优化与二值逻辑反投影算法验证
  • GESP 2023 年 12 月 C++ 二级认证试题解析(选择题 9-15)
  • GLM-5 开源发布:7440 亿参数智能体模型
  • 通义万相 2.1 文生图技术优势与特性解析
  • C++ STL map 核心解析:从原理到实战应用
  • DeepFace 结合 OpenCV 实现实时情绪分析
  • 离职后如何变现手中期权:行权、回购与税务全解析
  • AI 大模型对网络的五大需求及技术应对方案
  • C++ 线程库与多线程编程核心机制解析
  • FLUX.1-dev 本地部署与 Midjourney 迁移指南 + Prompt 工程实践
  • 论文笔记 DiT:基于 Transformer 的可扩展扩散模型
  • Deer-flow:字节跳动开源的高性能轻量级 C++ 工作流引擎
  • 中国人工智能大模型技术白皮书:发展历程、关键技术及应用展望
  • OrangePi-5 Plus/5 Ultra 部署 YOLO26n 无人机检测与性能优化

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online