【LeetCode刷题】209. 长度最小的子数组

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

代码展示:

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值