问题
给定一个正整数数组
nums
和一个正整数 target
,返回其子数组的最小长度
总和大于或等于目标。如果没有这样的子数组,则返回 0。
问题链接:209。最小子数组总和
一些例子:
nums = [2,3,1,2,4,3] target = 7 output = 2
nums = [1,4,4] target = 4 output = 1
nums = [1,1,1,1,1,1,1,1] target = 11 output = 0
我的思考过程
class Solution(object):
def minSubArrayLen(self, target, nums):
i,j,sumSoFar=0,0,0
N = len(nums)
if N == 0:
return 0
min_len=float('inf')
while j < N:
if sumSoFar >= target:
min_len = min(j-i, min_len)
sumSoFar-=nums[i]
i+=1
else: #sumSoFar is less than target
sumSoFar+=nums[j]
j+=1
if min_len == float('inf'):
return 0
return min_len
问题
在第一种情况下尝试手动解决时(
nums = [2,3,1,2,4,3]
,target = 7
),
在我可以检查 j=6
作为可能的解决方案之前,我就到达了 [3,4]
,因为 j == N/6
。我也觉得
当我进入 if
条件时,我添加 nums[j]
两次(在 j=3
)。
我做错了什么?
你的想法是好的,但是当j达到N时循环就会结束,这导致你无法找到nums末尾的子数组。
这是一个可行的解决方案:
from math import inf
def solution(nums, target):
i=0
j=0
min_len = inf
sumSoFar=0
while j < len(nums) or sumSoFar >= target:
if sumSoFar >= target:
min_len = min(min_len, j - i)
sumSoFar -= nums[i]
i += 1
else: # sumSoFar is less than target
sumSoFar += nums[j]
j += 1
return min_len if min_len != inf else 0