class Solution:
def minSubArrayLen(self, s: int, nums: List[int]) -> int:
n = len(nums)
if n == 0:
return 0
start, end = 0, 0
current, length = 0, n + 1
while end < n:
current += nums[end]
while current >= s:
length = min(length, end - start + 1)
current -= nums[start]
start += 1
end += 1
return 0 if length > n else length
前缀和
数组中连续子序列的问题另一种常见的思路前缀和.
要求:
数组中每个元素都为正, 前缀和序列一定是递增的, 这样查找的结果才是唯一的
class Solution:
def minSubArrayLen(self, s: int, nums: List[int]) -> int:
if not nums:
return 0
n = len(nums)
ans = n + 1
sums = [0]
for i in range(n):
sums.append(sums[-1] + nums[i]) # `sums`最终的长度为`n+1`
for i in range(n):
target = s + sums[i]
bound = bisect.bisect_left(sums, target)
if bound != len(sums):
ans = min(ans, bound - i)
return 0 if ans == n + 1 else ans