209. 长度最小的子数组
1、滑动窗口,使用队列存储
把队列当作滑动窗口
var minSubArrayLen = function(target, nums) {
// 用一个队列进行控制,sum初始的列加和
let queue=[],sum=0,len=Infinity;
// 遍历整个数组
for(let i=0; i<nums.length; i++){
queue.push(nums[i])
sum += nums[i]
while(sum >= target){
len = Math.min(queue.length,len)
// 当大于的时候,需要一直将队头的元素弹出,减少sum的值,直到小于
sum -= queue.shift()
}
}
return len == Infinity ? 0 : len;
};
除了使用这样的队列进行控制,还可以直接使用指针来控制。这样不用使用额外的空间
var minSubArrayLen = function(target, nums) {
let i=0,j=0; // 用i,j控制符合条件的那一段数组
let sum=0,len=Infinity;
// 遍历整个数组
while(i<nums.length){
sum += nums[i++] //小于目标值,移动指针,累加sum
while(sum >= target){
len = Math.min(i-j,len) // i-j就是队列中元素的长度
sum -= nums[j++] // 用j指针控制弹出队头的元素
}
}
return len == Infinity ? 0 : len;
};
二、直接使用滑动窗口
解法一我们使用的是使用两个指针,我们也可以把它看做是一个窗口,每次往窗口中添加元素来判断是否满足。其实我们可以逆向思维,先固定一个窗口大小比如 leng,然后遍历数组,查看在数组中 leng 个元素长度的和是否有满足的,如果没有满足的我们就扩大窗口的大小继续查找,如果有满足的我们就记录下窗口的大小 leng,因为这个 leng 不一定是最小的,我们要缩小窗口的大小再继续找。