[JS算法]209. 长度最小的子数组

题目

在这里插入图片描述

思路

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;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值