算法挑战37: 长度最小的子数组

5 阅读1分钟

题目:

给定一个含有 n ****个正整数的数组和一个正整数 target

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

思路:

滑动窗口, 两个指针, 满足条件,缩小窗口,直到不满足, 不满足了就扩大窗口, 每次记录最小的子数组长度就好了

代码:

var minSubArrayLen = function (target, nums) {
    let slow = 0;
    let sum = 0;
    let minSize = Number.MAX_SAFE_INTEGER;
    const len = nums.length;
    for(let fast = 0; fast < len; fast++){
        sum += nums[fast];
        while(sum >= target){
            const currSize = fast -slow + 1;
            minSize = Math.min(currSize,minSize);

            sum -= nums[slow];
            slow++;
        }
    }
    return minSize === Number.MAX_SAFE_INTEGER ? 0 : minSize;
};