Bootstrap

滑动窗口解决获取长度最小的连续子数组问题

 滑动窗口定义

滑动窗口是一种动态的窗口,可以在数组或链表等数据结构上进行移动。窗口的大小可以固定,也可以动态调整。滑动窗口可以用来解决一些连续子序列问题,例如求解最大子序和、最小子序和、最长连续子序列等。

使用步骤(以此题为例)

  1. 初始化两个指针,left 和 right,都指向数组的第一个元素。
  2. 初始化一个变量 sum,用于记录当前窗口内的元素之和。
  3. 在 for 循环中,不断向右移动 right 指针,并将对应的元素值加到 sum 中。
  4. 当 sum 大于等于 target 时,进入while循坏,开始尝试缩小窗口大小,即向右移动 left 指针,并减去对应元素的值。
  5. 如果当前窗口的大小小于之前的最小长度,则更新最小长度为当前窗口的大小。
  6. 重复步骤3-5,直到 right 指针到达数组的最后一个元素。
  7. 如果找到了满足条件的子数组,返回最小长度;否则返回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
};

;