LeetCode长度最小的子数组 滑动窗口

209. 长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 target 

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度如果不存在符合条件的子数组,返回 0 

示例 1

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

示例 2

输入:target = 4, nums = [1,4,4]
输出:1

示例 3

输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

思路:

       这一题虽然是“子数组”,不过并不是动态规划哈哈哈。

       不过,这一题也是用我们非常常用的技巧:滑动窗口。因为题目要求的是连续子数组,因此滑动窗口非常符合这一条件,我们可以通过滑动窗口很好地遍历数组中所有连续子数组的情况。

       虽然滑动窗口在之前已经写过很多次了,但还是简单写一下它的大概思路,然后就直接放代码吧:我们在数组的最左端先初始化一个长度为0的窗口,用left和right表示窗口的左右边界。然后我们移动窗口的步骤是这样的:left不动,right向右移动,一直移动到窗口包含的值满足题目中给定的条件为止。此时我们记录并更新我们要求的结果。当窗口内的值满足条件时,我们开始收缩窗口,也就是移动left,当left移动到窗口内的值不满足条件时,继续保持left不动而移动right……如此反复。当我们的right到达终点时,我们的结果就会被更新至最佳~

下面代码里我也写了非常详细的注释:

代码:

class Solution(object):
    def minSubArrayLen(self, target, nums):
        left=0#窗口左边界
        right=0#窗口右边界
        summ=0
        res_len=float('inf')#结果长度 因为后面要用min,所以一开始初始化为无穷
        lenth=len(nums)#数组长度
        while(right<lenth):#当右边界还没有到终点时
            r = nums[right]#拿到新进入窗口的数
            right+=1#窗口右边界右移
            summ+=r#当前窗口内的和+这个数
            while(summ>=target):#当满足条件了
                res_len=min(res_len,right-left)#尝试更新最小长度
                r = nums[left]#现在准备左边界右移动,窗口收缩
                summ-=r#拿到准备要删掉的值后,summ减去它
                left+=1#左边界移动
        if res_len==float('inf'):#如果最终结果一直没有被更新
            return 0#说明没有解,按题意输出0
        return res_len

        滑动窗口能解决的问题很多了,一定要知道这个方法,然后开滑!~

posted @   JunanP  阅读(5)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示