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)
这里使用了前缀和结合二分的做法。
题解:
解法三
思路:
题解: