数组04-长度最小的子数组

题干:给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

也是很经典的滑动窗口寻找子序列的问题,重点依然是双指针

第一个需要思考的问题就是 快指针是子数组的结尾还是开始 这个很好想 双指针的特点就是只用循环一篇数组就可以实现暴力做法同样的效果 快指针指向的是子数组的末尾 而子数组的开始是动态的更新 因此慢指针指向的是子数组的开始

快指针遍历数组 当发现当前子数组已经符合大于target的要求时,记录当前的答案。而后开始处理慢指针,也就是让慢指针慢慢向前移动,砍去不必要的元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution(object):
def minSubArrayLen(self, target, nums):
fast=0
slow=0
sum=0
subl=0
result=float('inf')
while fast<len(nums):
sum+=nums[fast]
while sum>=target:
subl=fast-slow+1
result=min(subl,result)
sum-=nums[slow]
slow+=1
fast+=1
return result if result!=float('inf') else 0

同理 这里return的内容也值得回味一下 如果result不是初始的无穷大 则正常返回result 如果根本不存在这样的子数组 那么就else返回0 python的这种写法很容易让人摸不着北 (特别是c++用多了的情况)