阅读 64

「双指针」leetcode 209.长度最小的子数组(中等)

一、了解题目

附上原题链接:209. 长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 target

找出该数组中满足其和 ≥ target 的长度最小的连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0

示例:

输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
复制代码

二、题解分析

依据上述题意,我们来看下这道题具体的解题思路:

  • 定义两个指针 lr ,分别指向数组下标为 0 的位置。一次只动一个指针,步进为 1
  • l 指针不懂, r 指针后移。直到 sum >= target ,记录此时的最小窗口长度 min
  • l 指针后移, r 指针不动。判断 sum 是否大于等于 target ,是则缩小最小窗口长度 min ,否则重复步骤2;
  • min 值不能超过最大整数限度。

三、代码实现

依据上面的题解,我们将用 js 来实现这道题。具体实现代码如下:

/**
 * @param {number} target
 * @param {number[]} nums
 * @return {number}
 */let minSubArrayLen = function(target, nums){
    const len = nums.length;
    // 1.定义左指针,指向数组的头部
    let l = 0;
    // 2.存放最小窗口长度,初始化长度为数组长度 + 1
    let min = len + 1;
    // 3.存放数组的和
    let sum = 0;
    // 4.定义右指针,让右指针遍历整个数组
    for(let r = 0; r < len; r++){
        // 4.1 不断让右指针右移,且和前面的数进行相加
        sum += nums[r];
        // 4.2 当遇到sum大于等于目标数值时
        while(sum >= target){
            // 4.2.1 缩小一个窗口值
            sum -= nums[l];
            // 4.2.2 判断此时的滑动窗口与最小的滑动窗口大小哪个小
            min = Math.min(r - l + 1, min);
            // 4.2.3 将左指针向右移动一位
            l++;
        }
    }
    // 5.判断最小值是否超过实际数组长度,超过了则说明没有符合条件的数组,返回0;否则返回最小值min值
    return min === len + 1 ? 0 : min;
}
​
console.log(minSubArrayLen(7,[2,3,1,2,4,3])); // 2
复制代码

以上就是关于长度最小的子数组的题解,不知道对小伙伴们是否有帮助呢?

我们下期见👋👋👋

文章分类
前端