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

算法:滑动窗口技巧与应用

讲解滑动窗口算法的两个典型应用。一是求和大于等于目标值的最短连续子数组,利用正整数单调性优化暴力解法至 O(n)。二是求不含重复字符的最长子串,通过哈希表记录字符位置动态调整窗口。文章提供 C++ 代码实现、步骤解析及复杂度分析,帮助读者掌握双指针与哈希结合的核心思路。

CoderByte发布于 2026/3/30更新于 2026/10/25120 浏览
算法:滑动窗口技巧与应用

算法:滑动窗口技巧与应用

1. 长度最小的子数组

在这里插入图片描述

解题原理

在这里插入图片描述

📋 解题步骤
第一步:理解题意
  • 找一个连续子数组,使其和 ≥ target,且长度最小
  • 数组元素都是正整数(关键性质)
  • 无解返回 0
第二步:分析暴力解法
  • 枚举所有子数组:O(n²) 或 O(n³)
  • 对于 n = 10⁵ 会超时
第三步:寻找优化点
  • 正整数 → 窗口扩展时和单调递增
  • 可以用滑动窗口优化
第四步:设计滑动窗口
遍历右指针:扩展窗口,从右边进窗口
判断:如果 sum >= target:更新最小长度,收缩窗口,从左边出窗口
第五步:手动模拟
步骤leftright窗口sumresult
403[2,3,1,2]84
724[1,2,4]73
1045[4,3]72
第六步:编写代码
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int len = INT_MAX;
        int n = nums.size();
        int sum = 0;
        for (int left = 0, right = 0; right < n; right++) {
            sum += nums[right]; // 进窗口
            while (sum >= target) { // 判断
                len = min(len, right - left + 1);
                sum -= nums[left++];
            }
        }
        return len == INT_MAX ? 0 : len;
    }
};
第七步:验证边界
  • 单元素、无解、总和不足等情况
第八步:复杂度
  • 时间:O(n)
  • 空间:O(1)

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

在这里插入图片描述

题目信息
  • 题目:LCR 016. 无重复字符的最长子串(与主站第 3 题相同)
  • 难度:中等
  • 标签:哈希表、字符串、滑动窗口
解法总结
方法时间复杂度空间复杂度
集合O(n)O(min(n, 128))
哈希表O(n)O(min(n, 128))
数组(推荐)O(n)O(1)
核心思路

滑动窗口法:

  1. 用双指针维护一个无重复字符的窗口
  2. 用哈希表/数组记录每个字符最后出现的位置 遇到重复字符时,左指针直接跳到重复字符的下一个位置

在这里插入图片描述

代码示例(C++ 最优解)
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int hash[128] = {0};
        int ret = 0;
        int n = s.size();
        for (int left = 0, right = 0; right < n; right++) {
            hash[s[right]]++; // 进窗口
            while (hash[s[right]] > 1) { // 判断
                hash[s[left++]]--; // 出窗口
            }
            ret = max(ret, right - left + 1);
        }
        return ret;
    }
};

目录

  1. 算法:滑动窗口技巧与应用
  2. 1. 长度最小的子数组
  3. 解题原理
  4. 📋 解题步骤
  5. 第一步:理解题意
  6. 第二步:分析暴力解法
  7. 第三步:寻找优化点
  8. 第四步:设计滑动窗口
  9. 第五步:手动模拟
  10. 第六步:编写代码
  11. 第七步:验证边界
  12. 第八步:复杂度
  13. 2. 无重复字符的最长子串
  14. 题目信息
  15. 解法总结
  16. 核心思路
  17. 代码示例(C++ 最优解)

更多推荐文章

查看全部
  • LocalAI 本地部署与远程访问教程
  • Python 电力系统分析工具 PYPOWER 实战指南
  • 2024 LLM 领域核心术语盘点:从 MoE 架构到 o1 推理范式
  • 新兴市场股市估值与智能家居安全标准互动分析
  • C++26 反射类型检查的里程碑意义与核心机制
  • LeetCode 2612 最少翻转次数 C++ 解法
  • C++ std::optional 详解:类型安全的可选值封装
  • 12000 条招聘数据分析:Python 学习方向与就业选择
  • Java 内存模型(JMM)详解
  • 《Agent Runtime 工程化》第九章 可观测与 Trace:9.5 本地 trace JSON
  • WebGIS 开发工程师成长指南
  • 基于 Claude Code 的 AI 内容创作自动化工作流实践
  • 数据结构:栈与队列的实现与 OJ 题解析
  • 动态规划:01 背包与完全背包详解及 LeetCode 零钱兑换 II 解法
  • 2026 年 3 月 AI 领域动态:近 7 天全球热点事件梳理
  • AIGC 技术解析:市场现状、应用场景与未来趋势
  • 人工智能大模型应用开发:从微调适配到场景落地
  • 网络安全 SRC 漏洞挖掘实战指南与入门路径
  • Windows 10/11 部署 OpenClaw 指南:环境搭建与机器人互联
  • 去除 AI 写作痕迹的实用提示词指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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