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

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

滑动窗口算法是解决连续区间问题的利器。通过 LeetCode 209 题“长度最小的子数组”和 3 题“无重复字符的最长子串”,详解双指针不回退原理及哈希表配合策略。对比暴力解法,分析为何滑动窗口能将时间复杂度优化至 O(N)。附带 C++ 完整代码实现与关键逻辑注释,帮助读者快速掌握此类算法的核心思想与实战技巧。

ByteFlow发布于 2026/3/23更新于 2026/7/625 浏览
滑动窗口算法实战:最小和子数组与最长无重复子串

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

滑动窗口是处理连续区间问题的常用技巧。本文将通过两道经典题目,深入剖析其核心逻辑与 C++ 实现。

1. 长度最小的子数组 (LeetCode 209)

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

解法一:暴力求解 枚举所有可能的起始位置,向后寻找最短区间。虽然直观,但时间复杂度较高,容易超时。

解法二:滑动窗口 利用双指针维护一个窗口 [left, right]。右指针不断扩展窗口以累加和,一旦和满足条件,左指针收缩窗口以尝试找到更短的长度。关键在于左右指针均不回退,确保时间复杂度为 O(N)。

核心思路 当窗口内元素之和大于等于 target 时,记录当前长度并移动左指针;否则移动右指针。这样避免了重复计算前缀和。

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;
    }
};

2. 无重复字符的最长子串 (LeetCode 3)

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

解法一:暴力求解 枚举每个起点,向后遍历直到出现重复字符。需借助哈希表统计频次。

解法二:滑动窗口 同样使用双指针,但需配合哈希表(或数组)记录字符出现次数。当遇到重复字符时,收缩左指针直到重复消除。

核心思路 右指针进入新字符,若该字符频次超过 1,则持续移除左指针字符直至频次恢复为 1。每次移动后更新最大长度。

C++ 代码实现

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int hash[128] = {0}; // 数组模拟哈希表
        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;
    }
};

这两道题展示了滑动窗口在不同场景下的变体:前者基于数值和判断,后者基于字符频次。掌握这一模式能显著提升处理区间类问题的效率。

目录

  1. 滑动窗口算法实战:最小和子数组与最长无重复子串
  2. 1. 长度最小的子数组 (LeetCode 209)
  3. 2. 无重复字符的最长子串 (LeetCode 3)
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • 程序员必知的 10 大代码共享与协作平台
  • Vue3 + Python 校园排球俱乐部信息管理系统
  • Qwen2.5-7B 高性能 Web 推理服务部署指南
  • JDK 23 新特性与 ZGC 强制启用机制解析
  • Maven 高级特性:继承、聚合与私服配置
  • Flutter for OpenHarmony 集成 dart_openai 实现 AIGC 功能
  • 使用 Higress 将 REST API 转换为 MCP Server 工具
  • Java 经典排序算法全解析
  • C++ 基础概念
  • WebLogic 中间件高危漏洞应急响应案例分析
  • Cursor 实战:从零开发 Web 背单词应用
  • 算法题解:牛客 NC221681 dd 爱框框
  • 腾讯云开发 Copilot 低代码开发体验与技术分析
  • AI 产品经理职业路径与核心能力解析
  • 未来三年职场涨薪趋势分析与应对建议
  • 谷歌与OpenAI合作利用搜索增强大模型知识时效性
  • 前端安全实践:密码存储与常见漏洞防护
  • 为什么 Python 成了开发 AI 的主流语言?
  • 滑动窗口算法专题:经典题目实战
  • 使用 Python SDK 调用 Coze 工作流详解

相关免费在线工具

  • 加密/解密文本

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