长度最小的子数组

**问题**

给定一个含有 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
相关推荐
海琴烟Sunshine13 小时前
leetcode 66.加一 python
python·算法·leetcode
rengang6614 小时前
09-随机森林:介绍集成学习中通过多决策树提升性能的算法
人工智能·算法·随机森林·机器学习·集成学习
CoovallyAIHub14 小时前
量子计算迎来诺奖时刻!谷歌赢麻了
深度学习·算法·计算机视觉
法拉第第15 小时前
caffine概率统计算法之Count-Min Sketch
算法
法拉第第15 小时前
淘汰策略之tinyLFU
算法
mit6.82415 小时前
[Tongyi] 工具集成 | run_react_infer
人工智能·深度学习·算法
闻缺陷则喜何志丹15 小时前
【C++贪心】P8769 [蓝桥杯 2021 国 C] 巧克力|普及+
c++·算法·蓝桥杯·洛谷
杨小码不BUG15 小时前
灯海寻踪:开灯问题的C++精妙解法(洛谷P1161)
c++·算法·数学建模·位运算·浮点数·信奥赛·csp-j/s
杨小码不BUG15 小时前
心痛之窗:滑动窗口算法解爱与愁的心痛(洛谷P1614)
开发语言·c++·算法·滑动窗口·csp-j/s·多维向量
咖啡啡不加糖15 小时前
贪心算法详解与应用
java·后端·算法·贪心算法