LeetCode.209.长度最小的子数组

题目描述:

给定一个含有 n个正整数的数组和一个正整数 target

找出该数组中满足其总和大于等于target的长度最小的

子数组

[numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度**。** 如果不存在符合条件的子数组,返回 0

输入输出实例:

思路:首先介绍一个暴力解法(时间复杂度较高没有通过),我们使用length和start两个变量用来表示子数组长度和起始下标,然后我们慢慢增加length长度和start,直到找到满足sum(nums[start:start + length]) >= target这一条件我们return length 。循环结束后我们return 0。但是这个方法时间复杂度较高,我们进行优化。

python 复制代码
class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        length = 1
        start = 0
        while length <= len(nums):
            while start + length <= len(nums):
                if sum(nums[start:start + length]) >= target :
                    return length
                start += 1
            start = 0
            length += 1
        
        return 0

优化后:使用滑动窗口, left和right为我们的左右区间,current_sum为该区间的值的总和,我们先从下标为0的值开始加,right往后走,直到区间的总和>=target,这时我们再对左侧进行删减以减少区间长度,left往后移,最小长度我们使用min_length = min(min_length,right - left + 1)实现,当前长度与原来最小长度取最小值。这样最后我们left和right围成的区间是满足条件的且长度最小的,由于我们刚开始min_length设置一个很大的值,如果最后依旧是这个值说明我们没有找到满足条件的区间return 0,否则return min_length

python 复制代码
class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        n = len(nums)
        current_sum = 0
        left = 0
        min_length = float('inf')

        for right in range(n):
            current_sum += nums[right]

            while current_sum >= target :
                min_length = min(min_length,right - left + 1)
                current_sum -= nums[left]
                left += 1
        
        return min_length if min_length != float('inf') else 0
相关推荐
转瞬都有2 分钟前
sqli-labs靶场自动化利用工具——第13关
python·sql·网络安全·自动化
Cyan_RA95 分钟前
C 408—《数据结构》算法题基础篇—链表(上)
java·数据结构·算法·链表·c·408·计算机考研
微刻时光15 分钟前
影刀RPA实战:自动化批量生成条形码完整指南
运维·python·低代码·机器人·自动化·rpa
山脚ice16 分钟前
【Hot100】LeetCode—5. 最长回文子串
算法·leetcode
青龙摄影27 分钟前
【自动化】BB自动化获取视频和音频地址并下载
java·python
微刻时光27 分钟前
影刀RPA实战:自动化同步商品库存至各大电商平台(二)
经验分享·python·低代码·机器人·开源·自动化·rpa
&&Citrus30 分钟前
【Petri网导论学习笔记】Petri网导论入门学习(三)
笔记·学习·算法·入门·petri网·petri
Utgnryk33 分钟前
数组与贪心算法——409、621(1中1简)
算法·贪心算法
桃酥40338 分钟前
贪心算法day29|134. 加油站(理解有难度)、135. 分发糖果、860. 柠檬水找零、406. 根据身高重建队列
c++·算法·leetcode·贪心算法·代码随想录
小付爱coding40 分钟前
【玩转贪心算法专题】135. 分发糖果[困难]
算法·贪心算法