209. 长度最小的子数组

滑动窗口

解题思路

  1. 利用滑动窗口来解决该题;

  2. 初始化一个 sum 表来记录 子数组 的和;

  3. sum >= target 说明窗口内存在 子数组 的和大于 target ,先扩张窗口右边界找到 子数组 ,再缩减窗口左边界找到 长度最小的子数组

    • 当窗口右边界向右扩张,统计窗口内的元素和 sum
    • 当窗口左边界向右缩减,统计窗口内的元素和 sum

复杂度

  1. 时间复杂度:O(N),其中 N 是数组的长度,指针 leftright 最多各移动 N 次;

  2. 空间复杂度: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;
};

参考资料

  1. 卡尔:《代码随想录》

打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. 滑动窗口
    1. 1.1. 解题思路
    2. 1.2. 复杂度
    3. 1.3. 代码实现
  2. 2. 参考资料