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

滑动窗口实战:长度最小的子数组与无重复字符的最长子串

滑动窗口算法实战:解决长度最小子数组与无重复字符最长子串问题。通过双指针不回退策略将时间复杂度优化至 O(N),前者动态维护区间和,后者结合哈希表检测重复。提供 C++ 完整实现及复杂度分析,助读者掌握核心技巧。

Qiny01发布于 2026/3/28更新于 2026/6/1121 浏览
滑动窗口实战:长度最小的子数组与无重复字符的最长子串

滑动窗口算法实战

本文针对两个经典的滑动窗口问题展开解析:长度最小的子数组和无重复字符的最长子串。通过对比暴力解法,展示双指针不回退策略如何将时间复杂度优化至 O(N)。

1. 长度最小的子数组

题目链接: 209. 长度最小的子数组 - LeetCode

问题分析

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

解法思路

暴力枚举所有子数组的时间复杂度为 O(N²),在数据量较大时会超时。我们可以利用滑动窗口的思想来优化。

维护一个窗口 [left, right],不断向右移动右指针 right 扩大窗口,累加窗口内元素和 sum。当 sum >= target 时,记录当前窗口长度,并尝试移动左指针 left 缩小窗口,直到 sum < target。在这个过程中,我们不需要回溯 left 指针,因为对于当前的 right,一旦找到满足条件的最小 left,下一个 right 对应的最优 left 一定在当前 left 的右侧或相同位置。

C++ 代码实现

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int n = nums.size(), sum = 0, len = INT_MAX;
        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)。虽然有两层循环结构,但 left 和 right 指针都只向右移动,每个元素最多被访问两次。
  • 空间复杂度: O(1)。

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

题目链接: 3. 无重复字符的最长子串 - LeetCode

问题分析

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

解法思路

同样采用滑动窗口。我们需要保证窗口内的字符都是唯一的。使用哈希表(或数组)统计窗口内字符的出现频次。

  1. 右指针 right 遍历字符串,将字符加入窗口。
  2. 如果某字符频次超过 1,说明出现重复,此时需要移动左指针 left 直到该字符频次降回 1。
  3. 每次更新最大长度 ret。

C++ 代码实现

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int hash[128] = {0}; // ASCII 码范围足够
        int n = s.size(), left = 0, right = 0, ret = 0;
        while (right < n) {
            hash[s[right]]++; // 字符入窗口
            while (hash[s[right]] > 1) { // 有重复,收缩左边界
                hash[s[left++]]--;
            }
            ret = max(ret, right - left + 1); // 更新结果
            right++; // 继续扩展
        }
        return ret;
    }
};

关键点总结

  • 哈希表的作用: 快速判断当前字符是否已在窗口中存在。
  • 指针不回退: 这是滑动窗口效率高的核心。一旦确定某个位置作为左边界不再可能产生更优解,就永久跳过它。
  • 边界处理: 注意空字符串或全重复字符的情况,上述逻辑已涵盖。

掌握这两个模板后,类似的变体问题(如含 K 个不同字符、最小覆盖子串等)都能迎刃而解。

目录

  1. 滑动窗口算法实战
  2. 1. 长度最小的子数组
  3. 问题分析
  4. 解法思路
  5. C++ 代码实现
  6. 复杂度分析
  7. 2. 无重复字符的最长子串
  8. 问题分析
  9. 解法思路
  10. C++ 代码实现
  11. 关键点总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • cJSON 1.7.19 源码剖析:数据结构、解析生成与注释规范
  • 动态规划专题:子序列问题的核心思路与实战
  • 基于 YOLOv8/v11 与 LLM 的 Web 视觉检测系统 (Django+Vue3)
  • 6 克 ESP32 微型无人机:手机 Wi-Fi 遥控系统设计与实现
  • 牛客 NC221681 dd 爱框框:滑动窗口实战解析
  • AI Agent 安全漏洞与 Claude Code 编程范式转移
  • Pi0 机器人 VLA 大模型在昇腾 A2 平台上的测评
  • Python 面向对象编程三大特性:封装、继承与多态的 15 道实战练习题
  • Qwen2.5-Coder:阿里开源的个性化编程助手
  • 滑动窗口算法详解与经典例题实战
  • Moectf2025 Web、Misc 与 Crypto 解题思路汇总
  • Windows 版 nvm 安装配置与 Node.js 多版本管理教程
  • AI 写作发展趋势与展望
  • Immutable.js 实战:React 状态管理与避坑指南
  • AI 辅助 Java 入门:开发环境配置与核心语法实战
  • Apache IoTDB 跨端边云架构与 DB+AI 融合实践
  • Java 大数据在智能家居环境监测与智能调节中的应用实战
  • 基于多版本 YOLO 与 SpringBoot 的实时跌倒检测系统
  • Rokid 灵珠平台搭建旅游 AR 智能体教程
  • 系统架构师技术复盘:Flowable、软考备考与 AIGC 实践之路

相关免费在线工具

  • 加密/解密文本

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