209. 长度最小的子数组 - 力扣(LeetCode) (leetcode-cn.com)
一;窗口核心元素:
1.窗口中所有数值总和
2.窗口的大小
3.窗口大小的替换(要最小的)
二;为什么符合条件后要进入 while 循环
若窗口的最后一位数值很大,窗口的起始位置向后移动一个之后整个窗口的数值依旧大于目标值,就需要继续移动窗口起始位置。
三;最终返回最小子数组长度时的判断
// 滑动窗口解法(双指针法)
var minSubArrayLen = function (target, nums) {
let i = 0 // 起始指针位置
let sum = 0 // 总和
let subLength = 0 // 窗口大小
let res = nums.length + 1 // 用于判断整个数组中是否有满足 其和 ≥ target 的子数组
// 循环累加数组的值
for (var j = 0; j < nums.length; j++) {
sum += nums[j]
// 当数组累加的和大于目标值时进入循环
while (sum >= target) {
subLength = j - i + 1 // 计算窗口大小
sum -= nums[i++] // 起始位置+1(窗口滑动)
res = res < subLength ? res : subLength // 满足条件,更改res初值
}
}
// 如果res一直都比原数组大(初始值)就说明没有进入过while循环,也就意味着原数组中没有其和大于等于targer的子数组,则返回0
return res > nums.length ? 0 : res
};