这个题目卡了我好几天,脑袋里面有思路,但是手笨不会写,然后就犯懒拖了好久。今天周末,熬夜我也要结束掉它!
一、题目
题目未截全,如有需要,详见 https://leetcode-cn.com/problems/minimum-size-subarray-sum/
二、解析
这个题目研究这么久必然是要用大名鼎鼎的滑动窗口,先总结下滑动窗口公式:
不满足条件的时候右边界延申;满足条件的时候左边界收缩。掌握这条公式!!!
-
使用4个index:
left,right 来标记左右边界,按照之前说法:使用左开右闭区间,这样可以覆盖场景全面
sum 记录子数组的长度,和 target 对比
flag 标记满足条件的数组长度!长度!!
-
套用滑动窗口的公式
第一层用 for 循环:不满足条件,右边界延申:if sum < target : right++
第二层用 while 循环:满足条件时,左边界收缩:if sum >=target : left++
-
返回值flag取值,取长度
flag 要取所有满足条件中的最小值,初始设置 len(nums)+1,此处使用一个内置函数,min(flag,right-left+1),因为是长度,所以记得 flag=right-left+1
三、编码
class Solution:
def minSubArrayLen(self, target: int, nums: list[int]) -> int:
left,right = 0,0
sum = 0
flag = len(nums)+1
for right in range(len(nums)) :
sum += nums[right]
if sum >= target:
while sum >= target:
flag = min(flag,right-left+1)
sum -= nums[left]
left += 1
right += 1
else:
right += 1
if flag == len(nums)+1:
return 0
else:
return flag
四、执行结果
今天截图及时,有执行结果的截图,记录一下