题目描述:给定一个含有n个正整数的数组和一个正整数s,找出该数组中满足其和>=s的长度最小的连续子数组,并返回其长度。如果不存在符合条件的子数组,返回0。
- 例如:
- 输入s = 7, nums = [2, 3, 1, 2, 4, 3]
- 输出:2
-
暴力解法
- 使用两层for循环从第一个元素开始求和,如果和大于s,记录下数组的长度。则第一层for循环从下一个元素开始求和,如果数组长度小于上一次的,更新最小长度,最后返回最小的数组长度。
def solve(nums, s):
minlen = 0
result = math.inf
for i in range(len(nums)):
sums = 0
for j in range(i, len(nums)):
sums += nums[j]
if sums >= s:
minlen = j - i + 1
if result > minlen:
result = minlen
return result
- 时间复杂度:
- 空间复杂度:
-
滑动窗口:
- 不断调节子序列的起始位置和终止位置。
-
窗口:满足其和>=s的长度最小的连续子数组。
-
起始位置:如果当前窗口的值大于s了,窗口就要向前移动了(缩小)。
-
结束位置:结束位置就是遍历数组的指针。
def minSubArrayLen(self, target, nums):
"""
:type target: int
:type nums: List[int]
:rtype: int
"""
startindex = 0
result = float('inf')
sums = 0
if sum(nums) < target:
return 0
for i in range(len(nums)):
sums += nums[i]
while sums >= target:
minlen = i - startindex + 1
result = min(result, minlen)
sums -= nums[startindex]
startindex += 1
return result
- 时间复杂度:
- 空间复杂度: