滑动窗口_长度最小的子数组

这道题用滑动窗口(同向双指针) 解决,需要抓住一个关键性质:数组里全是正整数,所以子数组的总和随长度增加而单调递增 。
这就是"利用单调性,规避很多没有必要枚举"的含义。
一、为什么可以用滑动窗口?
因为所有元素都是正整数:
-
向右扩展窗口(
right++)→ 总和一定变大或不变。 -
向左收缩窗口(
left++)→ 总和一定变小。
因此一旦窗口总和达到 target,再往右扩张只会让总和更大、长度更长,不会得到更优解。所以此时应该尝试收缩左边界,看看更短的子数组是否依然 ≥ target。
二、算法步骤
-
初始化
left = 0, sum = 0, min_len = INT_MAX -
右指针逐个进入窗口
for right = 0 to n-1:-
进窗口 :
sum += nums[right] -
判断 + 出窗口 :
while (sum >= target) {更新结果 :
min_len = min(min_len, right - left + 1)出窗口 :
sum -= nums[left]; left++;
}
-
-
循环结束后,如果
min_len还是INT_MAX,说明没有符合条件的子数组,返回0;否则返回min_len。
