(双指针)LeetCode 209 长度最小的子数组

灵神题单:据说很好的题单,mark一下

分享丨【算法题单】滑动窗口与双指针(定长/不定长/单序列/双序列/三指针/分组循环) - 讨论 - 力扣(LeetCode)

LeetCode 209 长度最小的子数组

问题分析:

给定一个只包含正数的数组和一个目标值 `target`,我们需要找到和大于等于 `target` 的最短子数组长度。

暴力解法:

最直接的方法是 固定左端点,枚举右端点,并在过程中计算子数组和:

  • 以第 0 个元素为左端点时,枚举子数组 `a, ab, abc, abcd, abcde`;
  • 以第 1 个元素为左端点时,枚举 `b, bc, bcd, bcde`;
  • 依此类推直到末尾。

每个子数组求和后,若 sum ≥ target,就用当前长度更新最小值 ans。

时间复杂度:O(n²)。

第一次优化:

由于数组中元素都是正数,如果从某个左端点开始,当累加到 `a+b+c < target`,继续加 `d` 后得到 `a+b+c+d ≥ target`,那么再加 `e` 一定也满足 `≥ target`。因此,当首次达到 `≥ target` 时就可以 提前 break,不需要继续枚举更长的子数组。

时间复杂度仍为 O(n²),但减少了部分冗余。

最终优化(滑动窗口 / 双指针):

进一步利用"正数数组"的 **单调性**。

  • 假设从左端点 `a` 开始,`a+b+c < target` 且 `a+b+c+d ≥ target`,则以 `a` 为起点的最短子数组长度为 4。
  • 接着考虑左端点为 `b`,由于 `a+b+c < target`,则 `b` 和 `b+c` 一定也 `< target`,因此无需从 b 重新累加,可以直接从上一次窗口 `a+b+c+d` 的和中减去 `a` 继续。
  • 如果 `b+c+d ≥ target`,则以 `b` 为起点的最短子数组长度为 3;否则继续扩展右指针,直到没有新元素可加入。

这样每个元素最多被访问两次(一次进窗口,一次出窗口),时间复杂度优化到 O(n)。

这个版本有的会超时,可能因为sum那里的复杂度问题

python 复制代码
class Solution(object):
    def minSubArrayLen(self, target, nums):
        """
        :type target: int
        :type nums: List[int]
        :rtype: int
        """
        length=float('inf')
        slow,fast=0,0
        while fast<len(nums):
            while(sum(nums[slow:fast+1])<target):
                fast=fast+1
                if fast==len(nums):
                    return 0 if length==float('inf') else length
            length=min(length,fast-slow+1)
            slow=slow+1
        if length==float('inf'):
            return 0
        else:
            return length
        

这个可以AC,total+=nums[fast]的时候要注意先return再加,否则可能边界超出

python 复制代码
class Solution(object):
    def minSubArrayLen(self, target, nums):
        """
        :type target: int
        :type nums: List[int]
        :rtype: int
        """
        length=float('inf')
        slow,fast=0,0
        total=nums[fast]
        while fast<len(nums):
            while(total<target):
                fast=fast+1
                if fast==len(nums):
                    return 0 if length==float('inf') else length
                total+=nums[fast]
            total-=nums[slow]
            length=min(length,fast-slow+1)
            slow=slow+1
        if length==float('inf'):
            return 0
        else:
            return length
相关推荐
古译汉书6 小时前
嵌入式铁头山羊STM32-各章节详细笔记-查阅传送门
数据结构·笔记·stm32·单片机·嵌入式硬件·个人开发
max5006007 小时前
基于Meta Llama的二语习得学习者行为预测计算模型
人工智能·算法·机器学习·分类·数据挖掘·llama
橘颂TA8 小时前
【数据结构】解锁数据结构:通往高效编程的密钥
数据结构
王哥儿聊AI8 小时前
Lynx:新一代个性化视频生成模型,单图即可生成视频,重新定义身份一致性与视觉质量
人工智能·算法·安全·机器学习·音视频·软件工程
手握风云-10 小时前
优选算法的寻踪契合:字符串专题
算法
闭着眼睛学算法10 小时前
【华为OD机考正在更新】2025年双机位A卷真题【完全原创题解 | 详细考点分类 | 不断更新题目 | 六种主流语言Py+Java+Cpp+C+Js+Go】
java·c语言·javascript·c++·python·算法·华为od
IT古董10 小时前
【第五章:计算机视觉-项目实战之目标检测实战】2.目标检测实战:中国交通标志检测-(2)中国交通标志检测数据格式转化与读取
算法·目标检测·计算机视觉
MobotStone10 小时前
LLM 采样入门到进阶:理解与实践 Top-K、Top-P、温度控制
算法
杨小码不BUG10 小时前
CSP-J/S初赛知识点精讲-图论
c++·算法·图论··编码·csp-j/s初赛
LeaderSheepH12 小时前
常见的排序算法
数据结构·算法·排序算法