长度最小的子数组

**问题**

给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

**注意问题**

子数组的定义:一个或**连续**多个数组中的元素组成一个子数组(子数组最少包含一个元素), 注意这个连续。

**解决方法**

解决方法可以分为两种,第一种是暴力破解法,也是最直观的方法,第二种是滑动窗口的方法

**暴力破解法**

复制代码
class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        # 初始 将min_value 设置为无穷大
        min_value=float('inf')
        flag=0

        input_len=len(nums)

        for i in range(input_len):
            tmp_value=0
            for j in range(i,input_len):
                # 进行嵌套的遍历 因为找的是子数组 具有连续性
                tmp_value+=nums[j]
                # 如果大于target,就和min_value进行比较,选择最小的
                if tmp_value>=target:
                    min_value=min(min_value,j-i+1)
                    flag=1
                    # 如果值大于target 就结束改循环
                    break
        
        if flag:
            return min_value
        else:
            return 0
                

但是上述的解决方法的时间复杂度在N 方,怎么优化这个暴力破解法呢,我们采用滑动窗口,变动右指针,如果当前的累加值是大于目标值,那就移动左指针,找最小的子数组,代码如下:

**滑动窗口法**

复制代码
class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        # 初始 将min_value 设置为无穷大
        min_value=float('inf')
        left=0

        num_len=len(nums)
        tmp_value=0
        # 一直往右走
        for j in range(num_len):

            tmp_value+=nums[j]

            while tmp_value>=target:

                min_value=min(min_value,j-left+1)
                # 往左边滑动,来找最小的子数组
                tmp_value-=nums[left]
                left+=1

        return min_value if min_value!=float('inf') else 0
相关推荐
恣艺35 分钟前
LeetCode 132:分割回文串 II
算法·leetcode·代理模式
LZQqqqqo3 小时前
C# 中生成随机数的常用方法
java·算法·c#
葵续浅笑3 小时前
LeetCode - 合并两个有序链表 / 删除链表的倒数第 N 个结点
java·算法·leetcode
哪 吒7 小时前
【2025C卷】华为OD机试九日集训第3期 - 按算法分类,由易到难,提升编程能力和解题技巧
python·算法·华为od·华为od机试·2025c卷
机器学习之心HML7 小时前
PSO-TCN-BiLSTM-MATT粒子群优化算法优化时间卷积神经网络-双向长短期记忆神经网络融合多头注意力机制多特征分类预测/故障诊断Matlab实现
神经网络·算法·cnn
数据与人工智能律师7 小时前
智能合约漏洞导致的损失,法律责任应如何分配
大数据·网络·人工智能·算法·区块链
天天开心(∩_∩)8 小时前
代码随想录算法训练营第三十九天
算法
weisian1518 小时前
力扣经典算法篇-41-旋转图像(辅助数组法,原地旋转法)
算法·leetcode·职场和发展
朝朝又沐沐10 小时前
算法竞赛阶段二-数据结构(40)数据结构栈的STL
开发语言·数据结构·c++·算法
2501_9277730710 小时前
数据结构——单向链表
数据结构·算法