【力扣】209:长度最小的子数组 | 滑动窗口|双指针

题目描述

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

输入: s = 7, nums = [2,3,1,2,4,3]
输出: 2
解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-size-subarray-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

算法思路

class Solution:
    def minSubArrayLen(self, s: int, nums: List[int]) -> int:
        MIN,n,i,j=float('inf'),0,0,0
        while j<len(nums):
            n+=nums[j]
            while n>=s:
                MIN=min(j-i+1,MIN)
                n-=nums[i]
                i+=1
            j+=1
        return 0 if MIN==float('inf') else MIN

/2020/06/28/今天打卡了这道题,所以回来回顾一下.

找出该数组中满足其和 ≥ s 的长度最小的连续子数组,一般来说 很容易想到滑动窗口

怎么使用滑动窗口呢?
现在给定一个窗口,由i,j表示窗口的左右边界。然后进入遍历:

		MIN,n,i,j=float('inf'),0,0,0
        while j<len(nums):
        	n+=nums[j]
            while n>=s:
            	pass
            j+=1

我用变量n来保存窗口内的值的和,当n<s时,右边界j不断拓展,直到n>=s,进入第二阶段:

			while n>=s:
                MIN=min(j-i+1,MIN)
                n-=nums[i]
                i+=1

满足条件n>=s,就更新一下最小长度,然后缩减左边界,直到n<s

在return这里使用一个三元表达式来涵盖特殊情况,不存在符合条件的子数组时。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页