209. 长度最小的子数组
问题链接
https://leetcode.cn/problems/minimum-size-subarray-sum/description/
解题思路
这是一个长度不定的滑动窗口。
我们需要设置一个left指针和right指针,分别指向滑动窗口的左边界和右边界。
我们判定当前的滑动窗口是否满足题意,如果不满足,则继续移动右指针。
如果满足题意,那开始移动左指针,试图寻找最小的满足条件的范围。
在这个过程中,更新res。
代码
class Solution: def minSubArrayLen(self, target: int, nums: List[int]) -> int: left_ptr, right_ptr = 0, 0 res = 0 cnt = 0 while right_ptr < len(nums): if nums[right_ptr] >= target: return 1 cnt += nums[right_ptr] while left_ptr < right_ptr and cnt >= target: res = min(res, right_ptr-left_ptr+1) if res != 0 else max(res, right_ptr-left_ptr+1) cnt -= nums[left_ptr] left_ptr += 1 right_ptr += 1 return res
也可以这样写:
class Solution: def minSubArrayLen(self, target: int, nums: List[int]) -> int: left_border = right_border = 0 cur_sum = 0 res = len(nums) + 1 while right_border < len(nums): cur_sum += nums[right_border] while left_border <= right_border and cur_sum >= target: res = min(right_border-left_border+1, res) cur_sum -= nums[left_border] left_border += 1 right_border += 1 return res if res <= len(nums) else 0