Minimum Size Subarray Sum:从 O(n²) 暴力到 O(n) 滑动窗口,我只改了 4 行

发布时间:2026/9/16 9:04:39

Minimum Size Subarray Sum:从 O(n²) 暴力到 O(n) 滑动窗口,我只改了 4 行 读完本文你将了解滑动窗口的本质不是一行模板而是对「最优子结构」的直觉 | AI 是怎么一步步从暴力解里挖出滑动窗口的 | 这道题在 Uber 动态定价系统里的真实映射 题目原题给定一个正整数数组nums和一个正整数target求出数组中和至少为 target 的最短连续子数组的长度。如果不存在这样的子数组返回 0。项目说明输入target 7, nums [2,3,1,2,4,3]输出2约束1 ≤ target ≤ 10⁹1 ≤ nums.length ≤ 10⁵1 ≤ nums[i] ≤ 10⁵最优解是 [4,3]长度 2。 先问一个问题如果让 ChatGPT 第一眼看这道题它会怎么写它几乎必然会先用双重循环暴力遍历。这不是 AI 笨——暴力解对应的是人类的直觉枚举所有连续子数组算和选最短的。AI 的弱点也是人类的弱点直觉往往是慢解法。但 AI 有个好处它会把每一步推理都摊开来。你能看到它从哪一步开始怀疑暴力解不够好然后怎么找到更优方案。 第一版暴力解直觉的代价最朴素的想法两层循环枚举所有连续子数组defminSubArrayLen_brute(target,nums):nlen(nums)ansn1foriinrange(n):total0forjinrange(i,n):totalnums[j]iftotaltarget:ansmin(ans,j-i1)breakreturnansifansnelse0时间复杂度 O(n²)空间 O(1)。AI 的直觉没错。但它枚举完 [2,3,1,2] 之后下一轮从 [3,1,2,4] 开始——中间有大量重复计算。nums[1]nums[2]nums[3] 这个和第一轮算过第二轮又在算。它会什么时候意识到这个问题通常是在它自己测试一个长度为 10⁵ 的数组然后卡住的时候。暴力枚举O(n²)发现重复计算subarray sum 被反复加能不能复用右指针往右走时,左指针也右移?滑动窗口O(n) 滑动窗口让指针「滑」起来核心直觉就一句话数组全是正数右指针右移让和变大左指针右移让和变小。我们只需要找到「刚好 ≥ target」的那个时刻。算法流程右指针r向右滑累加total一旦total ≥ target尝试把左指针l往右移缩小窗口同时更新最短长度重复直到r走到头defminSubArrayLen(target,nums):ltotal0anslen(nums)1forrinrange(len(nums)):totalnums[r]whiletotal-nums[l]target:total-nums[l]l1iftotaltarget:ansmin(ans,r-l1)returnansifanslen(nums)else0为什么是 O(n)左指针l和右指针r都只向右移动每个元素最多被访问两次一次r加进来一次l移出去。没有回头没有重复计算。窗口的「呼吸」节奏渲染错误:Mermaid 渲染失败: Parse error on line 7: ...U V --|否|r继续右移| R U -- W[更新最 ----------------------^ Expecting SEMI, NEWLINE, SPACE, EOF, SQS, SHAPE_DATA, AMP, STYLE_SEPARATOR, DOUBLECIRCLESTART, PS, (-, STADIUMSTART, SUBROUTINESTART, VERTEX_WITH_PROPS_START, COLON, CYLINDERSTART, DIAMOND_START, TAGEND, TRAPSTART, INVTRAPSTART, START_LINK, LINK, LINK_ID, DOWN, DEFAULT, NUM, COMMA, NODE_STRING, BRKT, MINUS, MULT, UNICODE_TEXT, got PIPE☕ Java 实现CSDN 用户里 Java 开发者最多同样的思路Java 版本publicintminSubArrayLen(inttarget,int[]nums){intl0,total0,ansnums.length1;for(intr0;rnums.length;r){totalnums[r];while(total-nums[l]target){total-nums[l];l;}if(totaltarget){ansMath.min(ans,r-l1);}}returnansnums.length?ans:0;}Python 和 Java 的唯一区别是 Java 没有 break逻辑完全一致。 滑动窗口模式拆解什么时候用滑动窗口三个条件同时满足条件说明本题是否满足数据是数组/链表连续的结构✅需要找连续子序列不是任意子集✅子序列的性质是单调的加元素让某个值变大删元素让某个值变小✅如果三个条件都满足滑动窗口大概率能用。如果第三条不满足比如要找和等于某个值且数组有负数那就不是滑动窗口的问题了。同类题LeetCode 3无重复字符的最长字符串滑动窗口 哈希表LeetCode 76最小覆盖子串LeetCode 340至多包含 K 个不同字符的最长子串️ 真实产品场景Uber 动态定价中的时间窗口这道题在 Uber 的定价系统里有直接的映射。Uber 的时间窗口定价问题每个 5 分钟时间片都有供需数据。当某个时段的供需比达到阈值系统要找出满足该阈值的最短连续时间区间。这和minSubArrayLen完全一致正整数数组 供需比数据target 定价阈值最短连续子数组 最短需要进入动态定价的时间区间。Uber 2016 年的论文明确提到了用滑动窗口做时间序列的局部统计。这道题不是抽象的脑筋急转弯——它是 Uber 面试里用来验证候选人能不能把产品问题翻译成算法问题的经典题。✅ 面试官的点评写到什么程度算通过通过线能写出来 O(n) 的滑动窗口实现加分项能说出为什么双指针不会漏解因为左指针只向右不会跳过解能处理全 0 或者全小于 target 的边界情况能指出 nums 包含负数时滑动窗口不再适用常见踩坑while循环的条件写反写成total target而不是total - nums[l] targetans的初始值设成 0然后漏了无解的情况窗口缩小时没更新total 同类题推荐题目难度一句话思路LC 3 无重复字符的最长字符串Medium滑动窗口 哈希表记录字符位置LC 76 最小覆盖子串Hard滑动窗口 频次计数LC 340 至多 K 个不同字符Medium滑动窗口 哈希表计数来源说明✅ 已验证LeetCode 官方题解 本地 Python/Java 双语言实测 文档/论文Uber Dynamic Pricing 论文 (2016)
延伸阅读

更多相关文章

2026/9/14 23:14:46

LangChain 1.3.x实战:从RAG系统构建到多智能体工作流开发

当前B站最全最细的 LangchainV1.3 应用开发全套教程!从LangChain构建RAG应用到LangGraph构建多智能体工作流!少走99%的弯路! 最近在AI应用开发领域,LangChain无疑是最热门的技术框架之一。但很多开发者在学习过程中都会遇到各种问…

2026/9/12 17:20:02

国风动漫mv爆款视频制作

首先打开豆包,输入以下提示词,可自行改成自己的:你是一名现代二次元动漫mv短视频创作者, 根据《风若是拦不住》歌词: 我曾经迎着风当成我的梦 可茫茫尘世中人与人不同 有些感情注定是一程 后来我背着风不为谁心痛 任风…

2026/9/16 8:59:43

SSM+Vue煤矿安全管理信息系统设计与实现

1. 项目背景与需求分析煤矿安全管理信息系统是煤炭行业数字化转型的重要组成部分,旨在通过信息化手段提升煤矿安全生产管理水平。2026届毕业设计选择"SSMVue煤矿安全管理信息系统"作为课题,反映了当前煤炭行业对智能化安全管理的迫切需求。煤矿…

2026/9/16 8:59:43

Java泛型原理与实战:类型擦除、通配符PECS及避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/16 8:59:43

MCP工具返回true≠硬件成功:小智硬件控制避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/16 8:54:41

Linux桌面应用闪退问题解决笔记(Electron 通用)

一、哪些软件会闪退 Linux 下所有 Electron / Chromium 内核软件极易闪退: QQ音乐(deb 版)Linux QQLinux 微信部分新版客户端、IDE 二、闪退根本原因 Linux Mint / Ubuntu 系列系统对 Chromium 沙箱(sandbox) 权限…

2026/9/15 4:54:30

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/16 0:04:09

PHP源码部署实战:从环境配置到运行情侣游戏全攻略

简介:这是一套面向情侣互动场景的PHP完整源码,集成情侣飞行棋、真心话大冒险、情趣骰子等玩法,并内置完整分销制度,可自定义多种返佣比例,源码完全开源无加密,支持微信无感自动授权登录与第三方授权&#x…

2026/9/15 14:22:53

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/15 21:31:11

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/15 11:42:23

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码