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

滑动窗口算法详解:最小子数组与无重复字符

介绍滑动窗口算法,通过两个经典题目讲解其原理与应用。首先解决长度最小的子数组问题,利用双指针同向移动维护区间和;其次解决无重复字符的最长子串问题,结合哈希映射判断字符重复。文章提供 C++ 代码实现及详细解析,帮助理解滑动窗口“进窗口”、“出窗口”的核心逻辑。

Kubernet发布于 2026/3/30更新于 2026/9/1292 浏览
滑动窗口算法详解:最小子数组与无重复字符

滑动窗口算法详解

滑动窗口本质上也是双指针,但与前文介绍的相向移动不同,滑动窗口的两个指针是同向移动的。本文通过两个经典题目介绍滑动窗口的基本使用。

长度最小的子数组

题目描述

给定一个包含 n 个正整数的数组 nums 和一个正整数 target,找出该数组中满足其和 >= target 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。

算法原理

滑动窗口的本质是两个指针同向移动,通过这两个指针的移动判断区间之和是否满足条件。如果满足就进行比较长度大小。

初始化时两个指针起点相同:

int left = 0, right = 0;

滑动窗口涉及两个操作:进窗口和出窗口。

  • 进窗口:当区间之和 < target 时,需要更多数字参与,右指针向右移动。
  • 出窗口:当区间之和 >= target 时,尝试缩小窗口以寻找更短长度,左指针向右移动。

代码实现

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int ans = INT_MAX, left = 0, right = 0, sum = 0;
        for (; right < nums.size(); right++) {
            sum += nums[right];
            while (sum >= target) {
                ans = min(ans, right - left + 1);
                sum -= nums[left++];
            }
        }
        return ans == INT_MAX ? 0 : ans;
    }
};

无重复字符的最长子串

题目描述

给定一个字符串 s,请你找出其中不含有重复字符的最长子串的长度。

算法原理

本题同样适用滑动窗口三部曲:第一是进窗口,第二是判断,第三是出窗口。 使用哈希映射(数组模拟)来判断是否存在重复字符。如果映射值大于 1,则说明有重复,需要出窗口直到满足条件。

代码实现

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int hash[256] = {0}, ans = 0;
        for (int left = 0, right = 0; right < s.size(); right++) {
            hash[s[right]]++;
            while (hash[s[right]] > 1) {
                hash[s[left++]]--;
            }
            ans = max(ans, right - left + 1);
        }
        return ans;
    }
};

目录

  1. 滑动窗口算法详解
  2. 长度最小的子数组
  3. 题目描述
  4. 算法原理
  5. 代码实现
  6. 无重复字符的最长子串
  7. 题目描述
  8. 算法原理
  9. 代码实现

更多推荐文章

查看全部
  • Git Clone 速度慢的解决方法
  • Linux 下安装 Claude Code 的常见问题与解决方案
  • AI 大模型时代:开发工程师与管理者应对机遇与挑战
  • C++ 红黑树原理与实现详解
  • Xilinx Ultrascale+ FPGA XDMA 时序约束配置指南
  • 谷歌如何识别AI生成图片及Midjourney版权标注规范
  • PostgreSQL 动态分区裁剪技术:查询性能优化解析
  • llama.cpp 多环境部署指南:从 CPU 到 CUDA/Metal 的高效推理实践
  • 鸿蒙 WebView 混合开发跨域问题客户端解决方案
  • 2024 大模型典型示范应用案例深度解析
  • AI 技术演进:从 Function Calling 到 MCP
  • OpenClaw 部署环境要求:CPU、内存与系统配置清单
  • JetBrains 中 GitHub Copilot Agent Mode + MCP 配置与实战
  • Conda 虚拟环境与安装包路径修改:释放磁盘空间配置指南
  • 算法模拟实战:Z 字形变换与外观数列详解
  • CTF Web 入门:文件上传漏洞绕过技巧
  • Python 高校学生求职就业平台 Vue3 论坛
  • 本地高效部署大型语言模型的六种策略
  • 网络安全基础教程:概念、加密与攻击防护
  • ClawdBot 实战:树莓派 4 运行 OCR/Whisper/vLLM 实现 15 人并发无卡顿

相关免费在线工具

  • 加密/解密文本

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