滑动窗口算法详解
滑动窗口是一种常用的双指针技巧,通过维护一个动态的区间(窗口),利用左右指针的移动来扩大或缩小范围。这种方法通常能在一次遍历中解决问题,时间复杂度优化至 O(n)。
典型应用场景
- 寻找最长无重复字符的子串
- 找到和为目标值的最短子数组
- 字符串排列匹配
通用实现模板
- 初始化左右指针 left 和 right,均指向起始位置;
- 右指针 right 向右移动,模拟元素进入窗口;
- 当窗口内状态不满足条件时,左指针 left 向右移动,移除元素;
- 在移动过程中根据具体需求更新结果;
- 结束条件通常为 right 越界。

下面通过几个典型题目,带大家逐步拆解滑动窗口的实际应用。
长度最小的子数组
题目描述
给定一个含有 n 个正整数的数组和一个正整数 target,找出该数组中满足其和 ≥ target 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
解题思路
由于数组元素均为正整数,累加和具有单调性,非常适合套用滑动窗口模板:
- 定义 left 和 right 指针,同时指向首元素;
- right 指针向右移动,将元素加入窗口并累加 sum;
- 当 sum >= target 时,说明当前窗口满足条件,尝试收缩左边界以寻找更短的子数组;
- 在收缩过程中持续更新最小长度 len,直到 sum < target。
关键点:在收缩窗口(left++)的过程中,只要依然满足 sum >= target,就需要继续更新结果,因为可能存在更短的合法子数组。
思路可视化

代码实现
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
left = , right = ;
len = INT_MAX, sum = ;
(right < nums.()) {
sum += nums[right];
(sum >= target) {
len = (len, right - left + );
sum -= nums[left++];
}
right++;
}
len == INT_MAX ? : len;
}
};




