题目
给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其和 ≥ target
的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回 0
。
解法
1.暴力解法
一定会超时,但是能用
def minSubArrayLen1(target = 11, nums = [1,2,3,4,5]):
a = 1
b = 0
r = len(nums) + 1
while a <= len(nums):
if sum(nums[b:a]) >= target:
l = a - b
r = min(l, r)
b += 1
a = b + 1
else:
a += 1
# 如果没有符合返回0
if r == len(nums) + 1:
return 0
return r
2.滑动窗口(劣质版)
会超时,但是能用
def minSubArrayLen2(target = 80, nums = [1,2,3,4,5]):
a, b = 1, 0 # 初始化指针
l = len(nums) + 1 # 提前计算长度减少运算
while b <= len(nums) - 1 and a <= len(nums):
print(nums[b:a],sum(nums[b:a]))
if sum(nums[b:a]) >= target:
l = min(l, a-b)
b += 1
else:
a += 1
# 如果没有符合返回0
if l == len(nums) + 1:
return 0
return l
3.滑动窗口
为什么上面会超时呢,原因是sum
函数一直被循环调用,很占用时间
改进方法,建一个suml
来存放和,使用加减来更新它
def minSubArrayLen3(target = 80, nums = [1,2,3,4,5]):
a, b = 0, 0 # 初始化指针
l = len(nums) + 1 # 提前计算长度减少运算
suml = nums[0] # 存放和的变量
while b <= len(nums) - 1 and a < len(nums):
if suml >= target: # 如果和大于等于目标
suml -= nums[b] # 减去开头
l = min(l, a-b+1) # 更新结果
b += 1
else:
if a + 1 != len(nums):
suml += nums[a+1]
a += 1 # 加上结尾
# 如果没有符合返回0
if l == len(nums) + 1:
return 0
return l