双索引技术:
滑动窗口、对撞指针
题目:给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。
示例: 输入: s = 7, nums = [2,3,1,2,4,3]
输出: 2
解释: 子数组 [4,3]是该条件下的长度最小的连续子数组。
我们需要定义两个指针left和right,分别记录子数组的左右的边界位置,然后我们让right向右移,直到子数组和大于等于给定值或者right达到数组末尾,此时我们更新最短距离,并且将left像右移一位,然后再sum中减去移去的值,然后重复上面的步骤,直到right到达末尾,且left到达临界位置,即要么到达边界,要么再往右移动,和就会小于给定值。
代码如下
class Solution:
def minSubArrayLen(self, s: int, nums: List[int]) -> int:
l = 0
r = -1
sum1 = 0
res = len(nums)+1
while (l<len(nums)):
if sum1 <s and r+1<len(nums) :
r += 1
sum1 += nums[r]
else:
sum1 -= nums[l]
l +=1
if sum1 >=s:
res = min(res,r-l+1)
if res == len(nums)+1:
res = 0
return res
#时间复杂度O(n)