滑动窗口定义
滑动窗口是一种动态的窗口,可以在数组或链表等数据结构上进行移动。窗口的大小可以固定,也可以动态调整。滑动窗口可以用来解决一些连续子序列问题,例如求解最大子序和、最小子序和、最长连续子序列等。
使用步骤(以此题为例)
- 初始化两个指针,left 和 right,都指向数组的第一个元素。
- 初始化一个变量 sum,用于记录当前窗口内的元素之和。
- 在 for 循环中,不断向右移动 right 指针,并将对应的元素值加到 sum 中。
- 当 sum 大于等于 target 时,进入while循坏,开始尝试缩小窗口大小,即向右移动 left 指针,并减去对应元素的值。
- 如果当前窗口的大小小于之前的最小长度,则更新最小长度为当前窗口的大小。
- 重复步骤3-5,直到 right 指针到达数组的最后一个元素。
- 如果找到了满足条件的子数组,返回最小长度;否则返回0。
题目
JS代码示例
设rusult初始值为最大值时,使用Number.MAX_SAFE_INTEGER,因为在JavaScript中没有Integer.MAX_VALUE属性。
var minSubArrayLen = function (target, nums) {
let left = 0//初始位置指针
let sum = 0
let result = Number.MAX_SAFE_INTEGER;//用来保存子数组长度,先设为最大值
for (let right = 0; right < nums.length; right++) {//终点指针
sum += nums[right]
while (sum >= target) {
//比较上次符合条件的子数组的长度和当前符合条件的的子数组长度
result = Math.min(result, right - left + 1)
sum -= nums[left]//子数组和减去当前初始位置的值
left++// 初始指针后移一位进行窗口滑动
// 此时right保持不变,while循坏中再次判断更新的sum>=target?
// 如果仍然符合就会继续移动left,直到跳出while,跳出后right才会继续移动
}
}
// 如果result在right遍历完数组后数值未改变,说明没有符合条件的子数组
return result == Number.MAX_SAFE_INTEGER ? 0 : result
};