209.长度最小的子数组,双指针(滑动窗口)解法

Posted on 2022-05-31 00:17  林安静  阅读(31)  评论(0)    收藏  举报

参考代码随想录:problems/0209.长度最小的子数组.md · programmercarl/leetcode-master(代码随想录出品) - Gitee.com

给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。

我的代码:

 1 class Solution:
 2     def minSubArrayLen(self, target: int, nums: List[int]) -> int:
 3         temp_ans = 0
 4         ans_len = float("inf")
 5         i = 0
 6         j = 0
 7         length = len(nums)
 8         while j < length:
 9             temp_ans += nums[j]
10             while temp_ans >= target:
11                 min_len = j - i + 1
12                 if min_len == 1:
13                     return min_len
14                 ans_len = min(min_len, ans_len)
15                 temp_ans -= nums[i]
16                 i += 1
17             j += 1
18         return 0 if ans_len == float("inf") else ans_len

标准解法:

 1 class Solution:
 2     def minSubArrayLen(self, s: int, nums: List[int]) -> int:
 3         # 定义一个无限大的数
 4         res = float("inf")
 5         Sum = 0
 6         index = 0
 7         for i in range(len(nums)):
 8             Sum += nums[i]
 9             while Sum >= s:
10                 res = min(res, i-index+1)
11                 Sum -= nums[index]
12                 index += 1
13         return 0 if res==float("inf") else res

双指针(滑动窗口)图示

 

 

注意!用while替代for时,遵循 初始化->设置循环条件->执行完作业->步进代码(犯了低级错误,即第三步过程中马上进行了步进!羞愧啊,花了我好多时间,心态炸了,基础不牢)