当前位置:   article > 正文

【LeetCode刷题】209. 长度最小的子数组_python给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其

python给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其

1:题目描述(力扣

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

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

2:解题思路

滑动窗口:遍历数组,起始位置从下标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

代码展示:

  1. class Solution:
  2. def minSubArrayLen(self, target, nums):
  3. # 初始化满足条件的长度,初始化为最大值
  4. res = float("inf")
  5. # 初始化满足条件的元素之和,初始化为0
  6. Sum = 0
  7. # 初始化起始位置,初始化为第一个元素的下标
  8. index = 0
  9. # 遍历数组
  10. for i in range(len(nums)):
  11. # 求和,与当前遍历的值
  12. Sum += nums[i]
  13. # 判断当前元素之和,是否大于等于目标值target
  14. while Sum>= target:
  15. # 当前元素之和大于等于目标值,更新res的值,取当前res和当前遍历到的元素下标与index之间的长度中的最小值
  16. res = min(res, i-index+1)
  17. # 减去起始位置的元素
  18. Sum -= nums[index]
  19. # 向右移动起始位置
  20. index += 1
  21. return 0 if res==float("inf") else res
'
运行

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/993183
推荐阅读
相关标签
  

闽ICP备14008679号