因为对第一次刷题还有一些记忆,依稀记得是滑动窗口...但是忘记如何实现,于是就按自己的暴力思路写了一遍,一度卡在该如何执行循环上,最后写出来发现测试用例过了,但是提交后会有3个用例超时,代码如下:
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
# nums = nums.sort()
left, res, round, size = 0, 0, 0, len(nums)
for round in range(size):
for right in range(round, size):
res += sum(nums[left: right+1])
# print("start sum is:" + str(res))
if left !=0 and right == size - 1:
if res < target:
left = 0
res = 0
else:
# print("end sum is:" + str(res))
return right - left + 1
else:
if res < target:
left += 1
res = 0
else:
return right - left + 1
return 0

之后又回顾了一次代码随想录的讲解!再次记忆深刻了!
Solving tips:最重要的就是知道如何在多退少补的过程中记录满足条件的最短子序列!!!
也就是要使用“最小长度=min(上轮最小长度,当前长度)”,并且这个操作是在“多退”的情况实现的,给LZ记住!!!!
好的,那么代码呢,如下:
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
slow, res, fast, subLen, size = 0, 0, 0, float('inf'), len(nums)
while fast < size:
# fast只顾往前走(为“少补”的情况)
res += nums[fast]
# 只有“多退”时,才考虑向前移动slow,并使得和进行相应的减小
while res >= target:
subLen = min(subLen, fast - slow + 1) # 比较并记录最小子序列
res -= nums[slow]
slow += 1
fast += 1
return subLen if subLen != float('inf') else 0 # 根据循环结果判断输出
今天的学习任务结束!家人们真的会温故而知新!!并且写笔记真的有用,我看教程看不懂,但是看我上次的笔记反而就能看懂。。。还得是我 ^_^ ~yeah!
1209

被折叠的 条评论
为什么被折叠?



