长度最小的子数组(JS)

 题目: 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

思想:利用滑动窗口的思想,先计算一段窗口内的数据和,如果满足条件再逐一减掉先前元素,直到不再符合条件,达到窗口不断往右滑的目的。最后返回的是长度最小的窗口长度。

        var minSubArrayLen = function(target, nums) {
            var sum = 0;
            var i = 0; //滑动窗口的起始位置
            var resLength = nums.length + 1; //先设置一个初始结果长度,反正总不可能超过总长度
            for (var j = 0; j < nums.length; j++) { //j来代表窗口的右端序列(窗口结尾)
                sum = sum + nums[j]; //先求出窗口内的数据和
                while (sum >= target) { //在和大于目标值的前提下进行
                    var subLength = j - i + 1; //滑动窗口的长度,即有几位数字
                    resLength = resLength < subLength ? resLength : subLength; //更新结果数组的长度
                    sum = sum - nums[i]; //先从左往右减掉一个值看看,即滑动窗口
                    i++; //i起到滑动的效果
                }
            }
            return resLength == nums.length + 1 ? 0 : resLength;
        };
        console.log(minSubArrayLen(4, [1, 4, 4]));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值