长度最小的子数组

**问题**

给定一个含有 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
相关推荐
美式请加冰1 分钟前
位运算符的介绍和使用
数据结构·算法
tankeven3 分钟前
HJ127 小红的双生串
c++·算法
Fcy6485 分钟前
与链表有关的算法题
数据结构·算法·链表
KerwinChou_CN7 分钟前
LangGraph 快速入门
服务器·网络·算法
安之若素.re25 分钟前
918. 环形子数组的最大和
算法
阿阿阿阿里郎28 分钟前
ROS2快速入门--C++基础
开发语言·c++·算法
free-elcmacom30 分钟前
C++<x>new和delete
开发语言·c++·算法
lxh011333 分钟前
计算右侧小于当前元素的个数 题解
javascript·数据结构·算法
滴滴答滴答答35 分钟前
机考刷题之 12 LeetCode 684 冗余的边
算法·leetcode·职场和发展
美式请加冰1 小时前
前缀数组的介绍和使用
数据结构·c++·算法