思路:
利用双指针的解法,指针left与指针right都从数组首部开始,使用一个变量sum来计算right所遍历的数组元素的和是否大于等于target。如果小于target,则right继续遍历下一个数,每次遍历一个元素。直到 sum 大于或等于target。
left
2 | 3 | 1 | 2 | 4 | 3 |
right
右指针开始遍历
left
2 | 3 | 1 | 2 | 4 | 3 |
right
不符合条件:
right + 1
直到符合条件:
left
2 | 3 | 1 | 2 | 4 | 3 |
right
因为之前创建了一个子数组长度 ret = len(nums) + 1
所以对数组进行对比 ret = min(ret, right - left)
让后left + 1向后移动,判断是否符合条件
left
2 | 3 | 1 | 2 | 4 | 3 |
right
不符合条件:right+1。
left
2 | 3 | 1 | 2 | 4 | 3 |
right
符合条件: 判断数组长度ret = min(ret, right - left),left+1
left
2 | 3 | 1 | 2 | 4 | 3 |
right
直到遍历整个数组。
lass Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
n = len(nums)
qi = 0
wei = 0
sum = 0
ret = n + 1
while wei <= n:
if sum < target:
if wei == n:
break
sum += nums[wei]
wei += 1
else:
ret = min(ret, wei - qi)
sum -= nums[qi]
qi += 1
return 0 if ret == n + 1 else ret