核心思路
滑动窗口算法的核心在于用两个指针维护一个动态区间,通过移动指针来扩大或缩小窗口。相比暴力枚举,它通常能在一次遍历中完成计算,将时间复杂度优化至 O(n)。
典型应用场景:寻找最长无重复字符的子串、找到和为目标值的最短子数组、字符串排列匹配等。
通用逻辑
- 初始化左右指针
left和right指向起始位置。 - 右指针向右移动(进窗口),更新当前状态。
- 当窗口不满足条件时,左指针向右移动(出窗口),直到满足要求。
- 在过程中记录最优解。
接下来我们通过四道经典题目来深入理解这一思想。
1. 长度最小的子数组
题目描述
给定一个含有 n 个正整数的数组和一个正整数 target,找出该数组中满足其和 ≥ target 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。

解题思路
由于数组元素均为正整数,累加和具有单调性。我们可以套用滑动窗口模板:
- 定义
left和right指针,初始均指向首元素。 right指针向右移动,累加sum。当sum >= target时,说明当前窗口合法,尝试收缩左边界以寻找更短的子数组。- 在收缩过程中,每次移除
nums[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;
}
};







