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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值