赞
踩
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
滑动窗口:遍历数组,起始位置从下标0开始,当元素之和大于目标值target时,向右移动起始位置,直到遍历完整个数组
以示例一为例:target=7,nums=[2,3,1,2,4,3]
第一步:
1:初始化返回符合要求长度的变量res,初始化为:最大值
2:初始化各元素之和的变量Sum,初始化为:0
3:初始化起始位置index,初始化为:0
第二步:遍历数组,将遍历到的元素与Sum相加,并赋值给变量Sum,
第三步:判断变量Sum与target的大小(while Sum >= target)
1:Sum大于等于target,满足题目条件;更新res变量的值,在当前res的值和当前遍历到的元素下标与起始位置index的长度中取最小值;更新Sum变量的值,已经在数组中找到了符合题意的子数组,需要继续向后寻找是否有更符合的,所以需要将起始位置的值从Sum中减去,并且更新起始位置index的值。
再向后遍历数组
2:当Sum小于target,一直向后遍历数组,直到Sum大于等于target;或者遍历完数组,结束遍历
第四步:遍历完整个数组后,判断res的值是否等于初始化的值,res等于初始值,说明没有找到符合题意的子数组,返回0;res不等于初始值,说明找到了符合题意的子数组,返回res
说明:判断Sum与target的大小时,为什么使用while,而不是if。
例如:target=100,nums=[1,1,1,1,1,100]
因为使用if,index=0,元素全部相加才大于目标值100,就直接结束了
但是可以移动index,index=1,index=2,index=3,index=4,index=5元素相加的结果分别为104,103,102,101,100均满足大于等于target
所以判断Sum与target的大小时,用while而不是if
代码展示:
- class Solution:
- def minSubArrayLen(self, target, nums):
- # 初始化满足条件的长度,初始化为最大值
- res = float("inf")
- # 初始化满足条件的元素之和,初始化为0
- Sum = 0
- # 初始化起始位置,初始化为第一个元素的下标
- index = 0
- # 遍历数组
- for i in range(len(nums)):
- # 求和,与当前遍历的值
- Sum += nums[i]
- # 判断当前元素之和,是否大于等于目标值target
- while Sum>= target:
- # 当前元素之和大于等于目标值,更新res的值,取当前res和当前遍历到的元素下标与index之间的长度中的最小值
- res = min(res, i-index+1)
- # 减去起始位置的元素
- Sum -= nums[index]
- # 向右移动起始位置
- index += 1
- return 0 if res==float("inf") else res
'运行
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。