Leetcode209 长度最小的子数组

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

おすすめ

転載: blog.csdn.net/weixin_44423625/article/details/121908708