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

 

posted @ 2023-01-15 17:13  BJFU-VTH  阅读(34)  评论(0编辑  收藏  举报