数组-长度最小的子数组

49 阅读1分钟

题目描述:给定一个含有 n ****个正整数的数组和一个正整数 target

找出该数组中满足其和 ****≥ target ****的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度 如果不存在符合条件的子数组,返回 0 。

对应力扣209题

最开始看到题我们大概会用双重for循环去遍历枚举出所有的情况然后返回最小值,按力扣的尿性来说可能就会返回超时了,一般这种类似题目我们用滑动窗口可以解决,类似于双指针,第一重for循环我们取i,即为滑动窗口的末尾,当这个值大于我们的target,我们在收缩滑动窗口的左端然后取值,代码如下:

/**
 * @param {number} target
 * @param {number[]} nums
 * @return {number}
 */
var minSubArrayLen = function(target, nums) {
    let start = 0, end = 0;
    let sum = 0;
    let len = nums.length;
    let res = Infinity;
    while(end < len) {
        sum += nums[end];
        while(sum >= target) {
            sum -= nums[start];
            res = Math.min(res, end - start + 1);
            start++;
        }
        end++
    }
    return res === Infinity ? 0 : res
};