当前位置: 首页 > news >正文

9.LeetCode 209. 长度最小的子数组 | 滑动窗口专题详解

目录

1. 题目解析

示例 1:

示例 2:

2. 算法原理

解法一:暴力枚举所有子数组的和 —— O(n²)

解法二:利用单调性,使用“同向双指针”来优化 —— O(n)

✅ 怎么用?

图解过程:

正确性?

时间复杂度

3. 编写代码

OJ链接:​ https://leetcode.cn/problems/minimum-size-subarray-sum/description/


1. 题目解析

本题来自 LeetCode 第 209 题:长度最小的子数组

题目描述:

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

找出该数组中满足其和 ≥target的长度最小的连续子数组[nums[l], nums[l+1], ..., nums[r-1], nums[r]],并返回其长度。如果不存在符合条件的子数组,返回0

示例 1:

输入:target = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3] 是该条件下长度最小的子数组。

示例 2:

输入:target = 4, nums = [1,4,4] 输出:1

📌关键点:

  • 子数组必须是连续的

  • 要求和≥ target

  • 返回的是最小长度,不是子数组本身

  • 若不存在,返回0


2. 算法原理

解法一:暴力枚举所有子数组的和 —— O(n²)

通过双重循环枚举所有子数组,计算和并比较,时间复杂度为 O(n²),在数据规模大时会超时。


解法二:利用单调性,使用“同向双指针”来优化 —— O(n)

这是本题的核心解法:滑动窗口(Sliding Window)

✅ 怎么用?

我们用两个指针leftright构建一个窗口,窗口内的元素和记为sum,窗口长度记为len

步骤如下:

  1. 初始化:left = 0,right = 0

  2. 进窗口​ →right向右移动,将nums[right]加入sum

  3. 判断​ → 如果sum >= target,说明当前窗口满足条件,尝试缩小窗口

    • 更新最小长度:len = min(len, right - left + 1)

    • 出窗口​ →left向右移动,sum -= nums[left++]

  4. 重复步骤 2~3,直到right遍历完整个数组

图解过程:

target = 7, nums = [2,3,1,2,4,3]为例:

  • 初始:left=0, right=0, sum=0, len=+∞

  • right=0→ 进窗口:sum=2→ 不满足

  • right=1→ 进窗口:sum=5→ 不满足

  • right=2→ 进窗口:sum=6→ 不满足

  • right=3→ 进窗口:sum=8→ 满足!→ 更新len=4,出窗口:sum=6, left=1

  • right=4→ 进窗口:sum=10→ 满足!→ 更新len=4(当前窗口 [3,1,2,4]),出窗口:sum=8, left=2

  • right=5→ 进窗口:sum=11→ 满足!→ 更新len=3([1,2,4]),出窗口:sum=7, left=3

  • right=5→ 再次判断:sum=7 >=7→ 更新len=2([2,4]),出窗口:sum=3, left=4

  • 循环结束

✅ 最终最小长度为2


正确性?

利用单调性,规避了很多没有必要的枚举行为

因为数组元素都是正整数,所以当sum >= target时,我们移动left指针一定能缩小窗口,且不会错过更优解。这是滑动窗口能成立的核心前提。


时间复杂度

  • right指针遍历数组一次 → O(n)

  • left指针也最多移动 n 次 → O(n)

  • 总体:O(n)

✅ 从 n+n → 2n → O(n),线性时间复杂度,非常高效!


3. 编写代码

以下是 Java 实现代码

class Solution { public int minSubArrayLen(int target, int[] nums) { int n = nums.length, sum = 0, len = Integer.MAX_VALUE; for (int left = 0, right = 0; right < n; right++) { sum += nums[right]; // 进窗口 while (sum >= target) { // 判断 len = Math.min(len, right - left + 1); // 更新结果 sum -= nums[left++]; // 出窗口 } } return len == Integer.MAX_VALUE ? 0 : len; } }

可直接复制运行。

欢迎在评论区留言交流,我们一起把滑动窗口吃透!


OJ链接:​ https://leetcode.cn/problems/minimum-size-subarray-sum/description/

祝你刷题顺利,早日拿Offer!点个关注

http://www.jsqmd.com/news/903848/

相关文章:

  • 论文写作避坑指南:书匠策AI的免费查重到底有多香?
  • OpenHarmony ACE 框架分析:ArkUI 渲染引擎架构
  • 信任增长引擎:盲盒源码系统小程序V6MAX、APP盲盒源码与国际版盲盒源码 - 壹软科技
  • 如何增加网站被收录的机会?让全站索引率提升40%的内链布局法
  • Science Robotics 人形机器人将在25年内取代大多数人类工人——真还是假?
  • 通过Nodejs快速构建接入Taotoken多模型服务的后端应用
  • 高中语文古诗词和文言文必背72篇电子版及朗读音频
  • 终极自动化指南:用Pulover‘s Macro Creator轻松实现Windows办公革命
  • Java-RPG-Maker-MV-Decrypter:3步操作解锁RPG游戏资源逆向分析
  • 2026年大型集团资产管理系统如何选型?不动产私有化部署平台解析 - 品牌2025
  • CMAQ新手避坑实录:从WRF飓风案例到CCTM运行,我踩过的那些路径与线程设置的‘坑’
  • Unreal Engine 4高级会话管理插件完整指南:如何快速实现多人游戏联机功能
  • 白酒行业如何借助工作手机管理系统,杜绝飞单私单与客户流失? - 山海工作手机管理系统
  • 工业HMI选型不再迷茫:一文读懂HMI核心参数与选型要点
  • 用Python+粒子群算法搞定多仓库物流配送:一个真实数据集的完整建模与求解实战
  • 如何用Gazebo Sim在5分钟内启动你的第一个机器人仿真项目
  • 制造业智能生产排程优化:当算法接管了“排班那张表“
  • 论文查重居然能免费?书匠策AI这个功能,很多同学还不知道!
  • Word怎么转txt?2026转换方法+快捷键保姆级教程 - AI测评专家
  • CISSP备考避坑指南:从零到持证,我的150小时高效复习路线图(含独家笔记模板)
  • 受载煤体表面裂纹扩展规律与声电效应实验及应用方案【附数据】
  • Kubernetes混沌工程实战:35次故障注入构建高可用集群韧性
  • 2026成都商用不锈钢厨房设备厂家评测:成都酒店厨房设备厂家/成都医院厨房设备厂家/TOP5权威实力对比 - 优质品牌商家
  • 如何增加网站被收录的机会?企业单页网站快速被抓取的4个偏门技巧
  • 萃猫翻译( Cuimao Translator)-
  • Windows内核级硬件指纹伪装:深入解析EASY-HWID-SPOOFER的实现原理与实战应用
  • VideoDownloadHelper终极指南:免费快速下载全网视频的完整教程
  • 如何永久解锁Cursor AI Pro功能:开源免费解决方案完整指南
  • 2026年成都本地靠谱软装硬装服务商推荐:成都八马空间建筑装饰,专注定制设计与精工施工 - 海棠依旧大
  • 如何评估IP查询工具的性能?4个核心指标+Python压测脚本