前置共识滑动窗口本质双指针left、rightright只会不断向右移动只前进不回头left只会不断向右移动只前进不回头两个指针最多各自遍历数组一次。一、时间复杂度分析1. 标准滑动窗口固定窗口 可变窗口结论O(N)N 数组 / 字符串长度推演right从 0 → N-1最多执行 N 次left只会 ≥ 上一次的值整体最多移动 N 次 所有元素最多被右指针访问一次、左指针访问一次每个元素总共被处理常数次。 不存在嵌套循环遍历全部区间区别于暴力枚举所有子数组 O (N²)。✅ 上篇固定窗口 4 道例题、下篇可变窗口 4 道例题无重复子串、最小子数组、最小覆盖子串最优实现全部为 O (N)⚠️ 重要区分坑点文档务必写上 上篇案例 2【滑动窗口最大值】我给的基础版本代码cpp运行if(right-left1 k){ // 内层循环遍历窗口求最大值 }这个写法内层循环遍历窗口最坏复杂度退化到 O (Nk)不属于标准高效滑动窗口。补充说明真正最优滑动窗口最大值需要单调队列才能维持严格 O (N)基础写法仅用于新手理解滑动流程工程 / 面试不推荐。2. 对比暴力解法暴力枚举全部连续子区间两层循环 O (N²)滑动窗口O (N) 数据量大的时候差距巨大N10⁵暴力直接超时滑动窗口可以顺利通过。3. 特殊拓展字符集带来的常数字符串类滑动窗口无重复子串、至多 2 种字符、最小覆盖子串 虽然用到哈希表 / 数组统计频次但是字符种类是常数英文字母 26、ASCII 128常数不计入复杂度依然是 O (N)。二、空间复杂度分析空间复杂度分为两类只使用变量/需要辅助容器数组、哈希表、队列类别 1仅使用基础变量sum、left、right、maxLen案例定长子数组平均数、至多 k 个 0 的最长子数组、最小长度子数组和空间复杂度O(1)只开辟固定数量普通变量不随输入 N 扩张。类别 2使用固定大小数组统计字符频次例如int cnt[26]统计小写字母 数组长度固定 26和输入字符串长度无关空间复杂度O(1)类别 3使用哈希容器 unordered_map /unordered_set案例无重复最长子串、至多两个不同字符最长子串、最小覆盖子串 最坏情况窗口容纳全部不同元素容器内元素数量上限等于字符集大小如果是有限字符集ASCII依然视作O(1)如果是任意无界数字输入最坏 O (N)面试标准答案常规字符串题目统一写 O (1)纯数字数组用哈希表则说明最坏 O (N)类别 4单调队列滑动窗口最大值最优解法队列最多存放窗口内 k 个元素 最坏 O (k)k ≤ N三、对应你文中 8 个例题复杂度汇总直接粘贴进文档上篇【蜗牛爬窗固定窗口】最多替换 k 字符最长子串时间 O (N)空间 O (1)cnt [26]滑动窗口最大值基础暴力遍历版时间 O (Nk)空间 O (1)备注单调队列优化版 → O (N)O (k)定长子数组平均数时间 O (N)空间 O (1)至多 k 个 0 最长二进制子数组时间 O (N)空间 O (1)下篇【伸缩魔法可变窗口】无重复字符最长子串时间 O (N)空间 O (1)ASCII 字符集和≥target 最短子数组时间 O (N)空间 O (1)至多 2 种不同字符最长子串时间 O (N)空间 O (1)最小覆盖子串时间 O (N)空间 O (1)字符集有限四、面试高频思考题Q1滑动窗口一定是 O (N) 吗A标准双指针滑动窗口一定 O (N)如果你在循环内部额外嵌套一层遍历窗口的代码复杂度会退化。Q2什么时候不能使用滑动窗口滑动窗口成立前提窗口扩张 / 收缩具备单调性正整数数组求最短子数组和满足单调性可以滑动窗口 存在负数数组求最短子数组和不满足单调性不能直接滑动窗口需要前缀和 哈希Q3O (N) 和 O (2N) 有区别吗算法复杂度只看阶O (2N) 简写为 O (N)常数忽略。左右指针各自遍历一遍就是典型 O (2N滑动窗口依靠双指针单向移动抛弃暴力枚举所有子区间将时间复杂度从 O (N²) 优化至线性 O (N) 空间开销取决于是否需要辅助容器字符类题目大多可以做到常数空间 O (1)。谢谢