这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战
一、了解题目
附上原题链接:209. 长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
示例:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
二、题解分析
依据上述题意,我们来看下这道题具体的解题思路:
- 定义两个指针
l和r,分别指向数组下标为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
以上就是关于长度最小的子数组的题解,不知道对小伙伴们是否有帮助呢?
我们下期见👋👋👋