滑动窗口
解题思路
利用滑动窗口来解决该题;
初始化一个 sum 表来记录 子数组 的和;
当
sum >= target
说明窗口内存在 子数组 的和大于 target ,先扩张窗口右边界找到 子数组 ,再缩减窗口左边界找到 长度最小的子数组
- 当窗口右边界向右扩张,统计窗口内的元素和 sum;
- 当窗口左边界向右缩减,统计窗口内的元素和 sum;
复杂度
-
时间复杂度:
O(N)
,其中 N 是数组的长度,指针 left 和 right 最多各移动 N 次; -
空间复杂度:
O(1)
代码实现
var minSubArrayLen = function (target, nums) {
let right = 0;
let left = 0;
let res = Infinity;
let sum = 0;
while (right < nums.length) {
// 扩张右侧窗口,找到 子数组和大于 target 的右边界
sum += nums[right++];
// 收缩左侧窗口,找到 长度最小的子数组
while (sum >= target) {
res = Math.min(res, right - left);
sum -= nums[left++];
}
}
return res === Infinity ? 0 : res;
};
参考资料
leetcode🧑💻 344. 反转字符串
上一篇