LeetCode 「中等」209.长度最小的子数组
题目描述
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其总和大于等于 target 的长度最小的子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
示例
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
输入:target = 4, nums = [1,4,4]
输出:1
输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0
解答
Code
/**
* @param {number} target
* @param {number[]} nums
* @return {number}
*/
var minSubArrayLen = function(target, nums) {
let left = 0; // 左指针
let right = 0; // 右指针
let currentSum = 0; // 当前窗口的和
let minLength = Infinity; // 用于记录最小长度,初始值为无穷大
while (right < nums.length) {
currentSum += nums[right]; // 扩展,窗口将右指针的值加入当前和
// 当前窗口的和大于等于目标值
while (currentSum >= target) {
minLength = Math.min(minLength, right - left + 1); // 更新最小长度
currentSum -= nums[left]; // 收缩窗口,移除左指针的值
++left; // 移动左指针
}
++right; // 移动右指针
}
return minLength === Infinity ? 0 : minLength;
};
