题目
思路
1,暴力解法
遍历出所有子序列,选出符合条件的最小子序列
2,滑动窗口
滑动窗口就是不断地更新子序列的起始位置和终止位置,从而得到我们想到的结果,过程如图所示。
图片引用于代码随想录
具体代码
暴力解法
var minSubArrayLen = function(target, nums) {
// 因为要得到最小数,所以初始化为最大的数
let res = Number.MAX_VALUE
for (let i = 0; i < nums.length; i++) {
// 用来记录子数组加起来的值
let num = 0;
for (let j = i; j < nums.length; j++) {
num += nums[j]
// 符合条件的那一刻,比较此时的答案是否是最小
// 因为再加下去就算符合条件也肯定比刚刚符合的那一刻大,所以进行break
if (num >= target) {
res = j + 1 - i < res ? j + 1 - i : res;
break;
}
}
}
// 如果res没有变化,说明整个数组没有符合条件的子数组
if (res === Number.MAX_VALUE) {
return 0;
}
return res;
};
这个暴力解法在力扣可以ac,因为也进行了一定的判断,减少了循环的次数
滑动窗口
var minSubArrayLen = function(target, nums) {
// 因为要得到最小数,所以初始化为最大的数
let res = Number.MAX_VALUE
// 定义窗口左右边界
let right = 0,left = 0,num = 0;
while (right < nums.length) {
// 不断地移动右边界
num += nums[right]
// 当符合条件时进行答案最小值得判断,并移动左边界从而得到这个情况的最小答案
while (num >= target) {
res = right + 1 - left < res ? right + 1 - left : res;
num -= nums[left]
left++;
}
right++;
}
return res == Number.MAX_VALUE? 0 : res;
};