-
类型:可变长度的滚动窗口
-
特点:在特定条件下输出结果
-
题目:给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
-
经验:(1)目标为最小量,初始为math.inf,不要初始为列表长度,会带来特殊值的麻烦(2)循环中每一步的先后顺序,以及是否放入while中都很有讲究。如果赋值时涉及其他变量一定注意两者的先后顺序,如果希望只要在while满足的条件内就一直更新则放入while内。(3)学习return a if condition else b的return写法(4)enumerate遍历,因为是python的内置函数,更加节省时间。(4)求最小,初始化最大的两种写法:
math.inf
/float('inf')
#列表遍历
##直接用end-start+1记录长度
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
sum,min_length=0,math.inf #维护
left=0
#移动right,更新维护
for right in range(len(nums)):
sum+=nums[right]
#right不变,移动left,更新维护
while sum>=target:
#输出结果
min_length=min(min_length,right-left+1)
sum-=nums[left]
left+=1
return 0 if min_length==math.inf else min_length
##用length记录长度
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
left=0
sum=0
length=0
min_length=math.inf
for right in range(len(nums)):
sum+=nums[right]
length+=1
while sum>=target:
min_length=min(min_length,length)
sum-=nums[left]
left+=1
length-=1
return 0 if min_length==math.inf else min_length
##enumerate遍历,更加节省时间
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
left = 0
sum_ = 0
res = float('inf') # 记录最短长度
for right, value in enumerate(nums):
sum_ += value
while sum_ >= target:
res = min(res, right - left + 1) # 比较之前最短的,和当前长度,取最小
sum_ -= nums[left] # 去掉最开头的数,并缩小窗口
left += 1
return res if res != float('inf') else 0 # 倘若遍历完都没有达到target,
# 说明没有满足的区间,直接返回0
明日计划:438. 找到字符串中所有字母异位词