Leetcode Link: 209. 长度最小的子数组 - 力扣(LeetCode)

题目

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

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

解法一

思路:滑动窗口法

  • 每次都移动窗口的右边界
  • 每次都收缩窗口左边界直到满足条件
  • 在满足条件的前提下更新 ans

题解

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        if sum(nums) < target:
            return 0
        # [former, latter)  窗口含左不含右
        former = latter = 0  # 初始时窗内无东西
        cur_sum = 0 # 当前和
        ans = float('inf') # 答案取最小,因此初始化为无穷大
        while(latter<len(nums)):
	        # 这里不能cur_sum<target时才执行,我开始就这样错的
	        # 我们要的是每次都扩充,然后再缩小
            cur_sum += nums[latter]
            latter += 1
            # 缩小窗口
            while(cur_sum-nums[former]>=target):
                cur_sum -= nums[former]
                former += 1
            # 必须有判断条件才能更新ans,开始就没有这个判断,错了。
            if cur_sum >= target:
                ans = min(ans, latter-former)
        return ans

解法二

思路【宫水三叶】前缀和 + 二分 运用题 - 长度最小的子数组 - 力扣(LeetCode)

这里使用了前缀和结合二分的做法。

题解

解法三

思路

题解

启发和联系