leetcode-209. 长度最小的子数组

95 阅读1分钟

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

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

示例 1:

输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
示例 2:

输入:target = 4, nums = [1,4,4]
输出:1
示例 3:

输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

来源:力扣(LeetCode) 链接:leetcode.cn/problems/mi… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

代码:


class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        left, right,size,temp = 0,0,1000000,1000000
        sum_windows = 0
        while right < len(nums):
            sum_windows += nums[right]
            while sum_windows >= target:
                temp = right - left + 1
                if temp < size:
                    size = temp
                sum_windows -= nums[left]
                print(left)
                left += 1
            right += 1
        if size == 1000000:
            return 0
        return size

思路: 外层循环结束位置,内层循环找到所有以当前结束位置的满足大于tariget的起始位置。并记录窗口长度

  • 外部循环,循环的是结束位置,也就是窗口的右边界
  • sum求和不能每次都把窗口中的数字都加和,那样会超时,当找到一个符合大于target的窗口时,要开始从sum里面减去nums[left]。