题目: 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
思想:利用滑动窗口的思想,先计算一段窗口内的数据和,如果满足条件再逐一减掉先前元素,直到不再符合条件,达到窗口不断往右滑的目的。最后返回的是长度最小的窗口长度。
var minSubArrayLen = function(target, nums) {
var sum = 0;
var i = 0; //滑动窗口的起始位置
var resLength = nums.length + 1; //先设置一个初始结果长度,反正总不可能超过总长度
for (var j = 0; j < nums.length; j++) { //j来代表窗口的右端序列(窗口结尾)
sum = sum + nums[j]; //先求出窗口内的数据和
while (sum >= target) { //在和大于目标值的前提下进行
var subLength = j - i + 1; //滑动窗口的长度,即有几位数字
resLength = resLength < subLength ? resLength : subLength; //更新结果数组的长度
sum = sum - nums[i]; //先从左往右减掉一个值看看,即滑动窗口
i++; //i起到滑动的效果
}
}
return resLength == nums.length + 1 ? 0 : resLength;
};
console.log(minSubArrayLen(4, [1, 4, 4]));