代码随想录训练营day02 | 数组part2 | 长度最小的子序列

题目链接🔗:长度最小的子序列

给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。

示例:

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

提示:

  • 1 <= target <= 10^9
  • 1 <= nums.length <= 10^5
  • 1 <= nums[i] <= 10^5

暴力解法

正确代码✅

class Solution(object):
    def minSubArrayLen(self, target, nums):
        """
        :type target: int
        :type nums: List[int]
        :rtype: int
        """
        # 暴力法
        result = float("inf")   # 最终结果
        sublen = 0   # 子序列长度
       
        
        for  i in  range(len(nums)):
            sum_arr = 0    # 数组和
            for j in range(i,len(nums)):
                sum_arr +=nums[j]

                if sum_arr >= target:
                    sublen = j - i + 1 
                    result = min(result,sublen)
                    break
        if result == float("inf"):
            result =0 
        else:
            result = result


        return result

 思路: 两次遍历数组,记录每次大于目标和的子序列长度,取最小。

滑动窗口

正确代码✅

class Solution(object):
    def minSubArrayLen(self, target, nums):
        """
        :type target: int
        :type nums: List[int]
        :rtype: int
        """
        # 滑动窗口
        sum_arr = 0 # 子序列的和
        sublen = 0 # 子序列长度
        result = float("inf") # 最终结果
    
        i = 0
        for j in range(len(nums)):
            sum_arr += nums[j]

            while sum_arr >= target:
                sublen = j - i + 1
                sum_arr -= nums[i]
                i +=1
                result = min(result,sublen)

        if result==float("inf"):
            result = 0
        else:
            result=result

        return result

总结:滑动窗口就是暴力法的优化,具体的定义变量存储,基本一致,所以在理解滑动窗口的前提,还是理解暴力法,循序渐进才能更容易理解

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值