Q209 长度最小的子数组
目录
题目:给定一个含有 n 个正整数的数组和一个正整数 s,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
1 我的想法
我看到这个问题,首先发现它是连续的、并且要求区间大小,会想到用前缀和操作——前缀和可以快速求出连续元素的值,但我对它的时间复杂度了解程度不够好。
核心结论:滑动窗口如果是求值的话,右窗口滑动的同时,大概率会有某个参数要进行操作,后续进行比较从而操作左窗口,这是一个连续过程,所以题目得是连续问题。
2 简要回答
因为数组元素都是正数,可以使用滑动窗口。右指针不断扩展并累加区间和;当区间和大于等于 target 时,持续移动左指针缩短区间并更新最小长度。两个指针都只向右移动,时间复杂度是 $O(n)$。
3 详细回答
| |
4 前缀和思路是否可行
可以。 设前缀和为 prefix,因为题目中的元素都是正整数,所以 prefix 严格递增。对每个左端点,可以二分查找第一个满足区间和大于等于 target 的右端点。
- 只用前缀和枚举左右端点:$O(n^2)$
- 前缀和 + 二分查找:$O(n\log n)$
- 滑动窗口:$O(n)$
滑动窗口更快的关键也是"元素全为正数":右端点右移时区间和只会增大,左端点右移时区间和只会减小,因此两个指针都不需要回退。
易错或补充:比如数组
[1,1,1,1,100],target = 100,滑动窗口的res初始值(sz+1)要够大,否则取不到正确答案。
