LeetCode长度最小的子数组 滑动窗口
给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其和 ≥ target
的长度最小的 连续子数组 [nums
l
, nums
l+1
, ..., nums
r-1
, nums
r
]
,并返回其长度。如果不存在符合条件的子数组,返回 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
滑动窗口能解决的问题很多了,一定要知道这个方法,然后开滑!~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了