209. 长度最小的子数组 JavaScript实现

224 阅读1分钟

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 不一定是最小的,我们要缩小窗口的大小再继续找。