209.长度最小的字数组

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        n=len(nums)
        left =0
        right=0 
        s=0
        result = inf
        while right<n :
            s+= nums[right]
            while s>=target:
                result =min(right-left+1,result)
                s -=nums[left]
                left +=1
            right +=1
        return result  if result !=inf else 0    
class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        """
        寻找数组中满足其和大于等于 target 的长度最小的连续子数组。

        Args:
            target: 目标和。
            nums: 输入的整数数组。

        Returns:
            最小子数组的长度,如果不存在则返回 0。
        """
        n = len(nums)
        ans = n + 1  # 初始化答案为一个不可能的值 (比最大可能长度 n 大 1)
                     # 也可以使用 float('inf') 或 math.inf
        s = 0      # 当前窗口内元素的和 (滑动窗口的和)
        left = 0   # 滑动窗口的左边界

        # 使用 enumerate 同时获取右边界索引 right 和元素值 x
        for right, x in enumerate(nums):
            s += x  # 将右边界元素加入窗口和

            # 当窗口和大于等于目标值时,尝试缩小窗口
            # 检查 s >= target 而不是 s - nums[left] >= target
            # 因为我们需要先确保当前窗口满足条件,再尝试缩小
            while s >= target:
                # 更新最小长度
                # 当前窗口长度为 right - left + 1
                ans = min(ans, right - left + 1)

                # 从窗口和中减去左边界元素的值
                s -= nums[left]
                # 将左边界向右移动,缩小窗口
                left += 1

        # 如果 ans 仍然是初始值 n + 1,说明没有找到满足条件的子数组
        # 否则返回找到的最小长度 ans
        return ans if ans <= n else 0
        # 或者 return ans if ans != n + 1 else 0
        # 或者 return ans if ans != math.inf else 0 (如果用 inf 初始化)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值