【leetcode】209. 长度最小的子数组

44 阅读1分钟

leetcode-209.png

没有仔细读懂题意,然后写了错误的代码,这里要求的是子数组,那么就是要求连续的

错误代码

这里的错误在于我直接开始排序了,倒序。选择最少的数字来满足题目要求,但是题目要求是子数组,这里就完全不满足题意了

var minSubArrayLen = function (target, nums) {
    nums.sort((a, b) => b - a)
    console.log(nums)
    let sum = 0
    for (let i = 0; i < nums.length; ++i) {
        sum += nums[i]
        if (sum >= target) {
            return i + 1
        }
    }
    return 0
};

正确代码

滑动窗口

滑动窗口来解决这一题,每次满足条件时记录最小的长度即可
left、right指针都向尾部移动
sum < target时,增大right,增大sum sum >= target时,增大left,减小sum

var minSubArrayLen = function (target, nums) {
    let left = 0
    let sum = 0
    let minLength = Infinity
    for (let right = 0; right < nums.length; ++right) {
        sum += nums[right]
        while (sum >= target) {
            minLength = Math.min(minLength, right - left + 1)
            sum -= nums[left]
            left++
        }
    }
    return minLength === Infinity ? 0 : minLength
};