class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
n=len(nums)
left =0
right=0
s=0
result = inf
while right<n :
s+= nums[right]
while s>=target:
result =min(right-left+1,result)
s -=nums[left]
left +=1
right +=1
return result if result !=inf else 0
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
"""
寻找数组中满足其和大于等于 target 的长度最小的连续子数组。
Args:
target: 目标和。
nums: 输入的整数数组。
Returns:
最小子数组的长度,如果不存在则返回 0。
"""
n = len(nums)
ans = n + 1 # 初始化答案为一个不可能的值 (比最大可能长度 n 大 1)
# 也可以使用 float('inf') 或 math.inf
s = 0 # 当前窗口内元素的和 (滑动窗口的和)
left = 0 # 滑动窗口的左边界
# 使用 enumerate 同时获取右边界索引 right 和元素值 x
for right, x in enumerate(nums):
s += x # 将右边界元素加入窗口和
# 当窗口和大于等于目标值时,尝试缩小窗口
# 检查 s >= target 而不是 s - nums[left] >= target
# 因为我们需要先确保当前窗口满足条件,再尝试缩小
while s >= target:
# 更新最小长度
# 当前窗口长度为 right - left + 1
ans = min(ans, right - left + 1)
# 从窗口和中减去左边界元素的值
s -= nums[left]
# 将左边界向右移动,缩小窗口
left += 1
# 如果 ans 仍然是初始值 n + 1,说明没有找到满足条件的子数组
# 否则返回找到的最小长度 ans
return ans if ans <= n else 0
# 或者 return ans if ans != n + 1 else 0
# 或者 return ans if ans != math.inf else 0 (如果用 inf 初始化)