Leetcode209
题目:
给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
示例:
题解:
方法:滑动窗口(双指针)
分析:基于双指针的思想,利用滑动窗口。span定义为开头指针到末尾指针的子数组。
开头指针为扩张指针,它是用于探索和为target的span,也就是,一直移动开头指针,直到开头指针到末尾指针span的和大于或等于target;此时,记录当前的span长度,然后开始移动末尾指针,直到span的和小于target,此时移动开头指针继续探索。步骤总结为:
- 移动开头指针,直到和大于或等于target
- 记录span的长度,移动末尾指针,直到和小于target,同时记录每次>=target时span的长度,进行比较。
- 重复上述。开头指针和末尾指针都不再移动。
⚠️注意:当末尾指针移动的时候,需要更新span的sum值,此时应该减去原有末尾指针所在的值。
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
result = float("inf")
index = 0 # end pointer
sum = 0
for i in range(len(nums)):
sum += nums[i]
while sum >= target:
result = min(result, i-index+1)
sum -= sum[index]
index +=1
return 0 if result==float("inf") else result