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

LeetCode 滑动窗口算法入门

讲解滑动窗口算法在 LeetCode 中的基础应用。介绍了长度最小的子数组、无重复字符的最长子串、最大连续 1 的个数 III 以及将 x 减到 0 的最小操作数四个典型例题。通过双指针维护动态窗口,利用哈希表或计数统计特征,将暴力解法优化至 O(n) 时间复杂度。文中提供了完整的 C++ 代码实现与详细思路分析,适合算法初学者掌握滑动窗口技巧。

咸鱼开飞机发布于 2026/3/30更新于 2026/7/2152 浏览
LeetCode 滑动窗口算法入门

简要介绍

滑动窗口算法是笔试面试及算法竞赛中常见的技巧,主要用于处理数组和字符串问题,尤其适合寻找满足特定条件的子数组或子字符串,以及连续子问题的计算。

滑动窗口的核心在于维护一个区间(窗口),其大小可以是固定或变化的。窗口在数据结构上移动来扫描数据。基本套路如下:

  1. 进窗口:将元素加入窗口。
  2. 判断条件:根据题意分析是否满足条件。
  3. 更新结果:记录当前最优解。
  4. 出窗口:移除不需要的元素以缩小窗口。

相关例题

长度最小的子数组

题目描述

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

示例 1:

输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。

示例 2:

输入:target = 4, nums = [1,4,4]
输出:1

提示:

  • 1 <= target <= 10^9
  • 1 <= nums.length <= 10^5
  • 1 <= nums[i] <= 10^4
实现思路

本质是维护一个滑动窗口,窗口内的值之和小于目标值时继续扩展,否则收缩。步骤如下:

  1. 定义左右指针指向开头,初始化最大长度为无穷大。
  2. 右指针右移,将当前值加入窗口和。
  3. 当和大于等于目标值时,更新结果长度,左指针右移出窗口。
  4. 右指针继续右移。
实现代码
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int 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;
    }
};
size
0
for
int
0
0
// 进窗口
while
min
1
// 判断
// 出窗口
return
0

无重复字符的最长子串

题目描述

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

示例 1:

输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
实现思路

使用哈希表记录字符出现次数。移动右指针加入字符,若字符重复则移动左指针直到满足条件,同时更新最大长度。

实现代码
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        unordered_map<char, int> hash;
        int n = s.size();
        int len = -1;
        for (int i = 0, j = 0; j < n;) {
            hash[s[j]] += 1;
            while (hash[s[j]] > 1) {
                hash[s[i++]]--;
            }
            len = max(len, j - i + 1);
            j++;
        }
        return len == -1 ? 0 : len;
    }
};

最大连续 1 的个数 III

题目描述

给定一个二进制数组 nums 和一个整数 k,假设最多可以翻转 k 个 0,则返回执行操作后数组中连续 1 的最大个数。

实现思路

转换为求最长区间,区间内 0 的个数不超过 k 个。使用双指针维护窗口,统计 0 的数量,超过 k 时左指针右移。

实现代码
class Solution {
public:
    int longestOnes(vector<int>& nums, int k) {
        int n = nums.size();
        int cnt = 0;
        int ret = -1;
        for (int i = 0, j = 0; j < n; j++) {
            if (nums[j] == 0) {
                cnt++;
            }
            while (cnt > k) {
                if (nums[i++] == 0) {
                    cnt--;
                }
            }
            ret = max(ret, j - i + 1);
        }
        return ret == -1 ? 0 : ret;
    }
};

将 x 减到 0 的最小操作数

题目描述

给你一个整数数组 nums 和一个整数 x。每一次操作时,你应当移除数组 nums 最左边或最右边的元素,然后从 x 中减去该元素的值。如果可以将 x 恰好减到 0,返回最小操作数;否则,返回 -1。

实现思路

转化为求最长区间,区间和等于数组总和减去 x。若总和小于 x 直接返回 -1。使用滑动窗口寻找和为 target 的最长子数组。

实现代码
class Solution {
public:
    int minOperations(vector<int>& nums, int x) {
        int n = nums.size();
        int k = 0;
        for (auto s : nums) {
            k += s;
        }
        k -= x;
        if (k < 0) return -1;
        int len = -1;
        int sum = 0;
        for (int i = 0, j = 0; j < n; j++) {
            sum += nums[j]; // 进窗口
            while (sum > k) {
                sum -= nums[i++]; // 出窗口
            }
            if (sum == k) {
                len = max(len, j - i + 1);
            }
        }
        return len == -1 ? -1 : n - len;
    }
};

目录

  1. 简要介绍
  2. 相关例题
  3. 长度最小的子数组
  4. 题目描述
  5. 实现思路
  6. 实现代码
  7. 无重复字符的最长子串
  8. 题目描述
  9. 实现思路
  10. 实现代码
  11. 最大连续 1 的个数 III
  12. 题目描述
  13. 实现思路
  14. 实现代码
  15. 将 x 减到 0 的最小操作数
  16. 题目描述
  17. 实现思路
  18. 实现代码
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • 基于GB28181/RTSP的AI视频平台全栈源码交付与OEM低代码集成
  • 基于 Stable Diffusion 制作上世纪 90 年代游戏美术风格
  • 基于 GB28181/RTSP 的全栈 AI 视频平台源码交付与 OEM 集成方案
  • 鸿蒙操作系统开发指南:从入门到应用模型实战
  • AI 农业创业:基于 ViT 的轻量化病虫害检测系统
  • Python 安装与环境配置实战指南
  • VTJ.PRO 2.0 深度解析:从低代码到 AI 智能体
  • JavaSE 核心语法与面向对象编程复习指南
  • 用 MCP 给 Claude 接上天气预报
  • 从Colab到生产:Llama Factory进阶迁移指南
  • 从 “吹爆” 到 “冷静”:AIGC + 低代码为何难破企业级开发的硬骨头?
  • Claude Code 本地环境配置与 API 接入指南
  • HTTP 应用层协议详解与简易服务器实现
  • kubectl 命令行工具介绍与安装配置
  • 基于 Python 和 Telethon 的 Telegram 搜索机器人搭建指南
  • Stable Diffusion WebUI Docker 部署指南
  • AI 智能体驾驭工程(Harness Engineering)核心解析
  • 2026 年国家自然科学基金 AI 使用声明撰写指南
  • Python 零基础自学教程
  • ComfyUI 工作流适配 Z-Image:可视化节点让 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