classSolution:defminSubArrayLen(self,target:int,nums: List[int]) ->int: res =len(nums)+1for i inrange(len(nums)):for j inrange(i+1, len(nums)+1):# 左闭右开 seq_sum =sum(nums[i:j])if seq_sum >= target: res =min(res, j - i)return res if res <=len(nums)else0
时间复杂度:O()
空间复杂度:O()
滑动窗口一个for+一个while写法
classSolution:defminSubArrayLen(self,target:int,nums: List[int]) ->int: l =0 sub_sum =0 res =float('inf')for r inrange(len(nums)): sub_sum += nums[r]while sub_sum >= target: res =min(res, r - l +1) sub_sum -= nums[l] l +=1return res if res !=float('inf')else0
滑动窗口
窗口内是什么?如何移动窗口的起始位置?如何移动窗口的结束位置?
# 左闭右闭,本质上只有一次循环,时间复杂度为O(1)classSolution:defminSubArrayLen(self,target:int,nums: List[int]) ->int: res =float('inf') l =0 r =0 sum_lr = nums[0]while l <= r and r <len(nums):if sum_lr < target: r +=1if r <=len(nums)-1: sum_lr += nums[r]else: res =min(res, r - l +1) sum_lr -= nums[l] l +=1return res if res !=float('inf')else0