day02 代码随想录算法训练营 209. 长度最小的子数组

题目:

209. 长度最小的子数组

我的感悟:

  • 滑动窗口,
  • 每次计算当前位置的值,
  • 满足要求就缩小,
  • 这样左右两个指针都不回退。一直右走。
  • 这个原理,还没太理解,感觉要在看看左神的视频。

理解难点:

  • 为什么可以不回退。

代码难点:

  • for 循环右边界
  • 里面while判断是否满足要求

总结概括:

代码示例:

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        left = 0
        right = 0
        sub_sum = 0
        min_len = len(nums) + 1 # 默认初始的长度比数组最大的+1就可以了
        for right in range(len(nums)):
            sub_sum += nums[right]
            while sub_sum >= target:    # 窗口满足要求,找到值,可以记录,并缩写窗口了
                min_len = min(min_len, right - left + 1)    # 记录此时的长度
                sub_sum -= nums[left]   # 记录后,窗口不需要了,窗口值减小
                left +=1    # 记录后,这个窗口就不需要了,左边界也右移
        # 最后判断一下,如果没有满足要求的,返回0
        # 特例是target = 11 ,nums = [1,1,1,1]
        if min_len == len(nums) +1: # 如果没找到符合要求的
            return 0
        else:   # 如果找到了返回最新的长度
            return min_len       

通过截图:

资料:

题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/

文章讲解:https://programmercarl.com/0209.%E9%95%BF%E5%BA%A6%E6%9C%80%E5%B0%8F%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84.html

视频讲解:https://www.bilibili.com/video/BV1tZ4y1q7XE

posted @ 2023-12-29 17:02  o蹲蹲o  阅读(0)  评论(0编辑  收藏  举报