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

题目描述:

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

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

子数组

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

输入输出实例:

思路:首先介绍一个暴力解法(时间复杂度较高没有通过),我们使用length和start两个变量用来表示子数组长度和起始下标,然后我们慢慢增加length长度和start,直到找到满足sum(numsstart: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
相关推荐
不是万能的豆学长3 小时前
filetidy 文件整理助手:一键归类 + 规范重命名(Python 零依赖单文件工具)
大数据·开发语言·python·技术美术
gCode Teacher 格码致知4 小时前
Pandas教学-18:number与numeric的区别
python·pandas
梦想不只是梦与想7 小时前
Python 中subprocess 模块:执行外部命令
python·subprocess·调用外部命令
懂点Tech8 小时前
ctfshow MISC入门图片篇(信息附加):misc41解题思路
开发语言·python
徐小夕8 小时前
花了3个月,我们做了一款 AI 版的“飞书文档”
前端·算法·github
Robert--cao8 小时前
移动底盘与机械臂联合规划:开源算法与工程实现
算法
小豆庄9 小时前
Mac 上给视频人脸打码:本地工具的依赖、追踪与推理管线
算法·视觉检测·视频·敏捷流程·纹理贴图
星夜离尘569 小时前
MATLAB 工程实验:从相邻块均值手写重叠 Allan 偏差,数清有效项
算法·matlab·均值算法
careathers10 小时前
【数据结构】从堆到 PriorityQueue:手写一个优先级队列
数据结构
y1su11 小时前
Leetcode 字符串模板
java·数据结构·算法·leetcode·职场和发展·动态规划