尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
从超时到AC;两种解法的深度剖析:力扣3904
一次看似正确的O(n)解法为何在LeetCode上惨遭TLE本文将带你拆解背后的时间复杂度陷阱。一、问题背景在刷力扣3904题时我遇到了一个有趣的现象两种思路几乎相同的解法一种超时一种顺利通过。这不仅仅是代码风格的区别而是对算法复杂度本质理解的体现。题目要求我们找到第一个稳定索引——即前缀最大值与后缀最小值之差不超过给定值k的最早位置。先看我的第一版代码注释部分和优化后的版本// 超时版本注释部分力扣3903行 int firstStableIndex(vectorint nums, int k) { int n nums.size(); if (n 1) return 0; int rightMin INT_MAX; for (int num : nums) rightMin min(rightMin, num); int leftMax INT_MIN; for (int i 0; i n; i) { leftMax max(leftMax, nums[i]); if (leftMax - rightMin k) return i; if (nums[i] rightMin) { rightMin INT_MAX; for (int j i1; j n; j) { rightMin min(rightMin, nums[j]); } } } return -1; } // AC版本 //两次for循环是o(2n)但是常熟系数一般忽略于是还是o(n) int firstStableIndex(vectorint nums, int k) { int n nums.size(); vectorint minValue(n); minValue[n - 1] nums[n - 1]; for (int i n - 2; i 0; --i) { minValue[i] min(minValue[i 1], nums[i]); } int maxValue INT_MIN; for (int i 0; i n; i) { maxValue max(maxValue, nums[i]); if (maxValue - minValue[i] k) { return i; } } return -1; }二、直观理解两种解法在做什么场景比喻想象你在一条街道上从左向右走手里拿着一个记录牌记录左边遇到的最大值同时你需要知道右边街道上最小的房子高度。第一种做法一开始就记住整条街最矮的房子。每当你路过当前最矮的房子时就重新跑回街道右侧重新确认最矮的是谁。第二种做法出发前就在每个位置贴好标签从这里到终点最矮的是XXX。你只需要边走边看标签即可。显然第二种做法更聪明——用空间换时间。三、时间复杂度深度分析超时版本披着O(n)外衣的O(n²)表面上看超时版本只有一个for循环似乎是O(n)。但陷阱藏在rightMin的更新逻辑中if (nums[i] rightMin) { rightMin INT_MAX; for (int j i1; j n; j) { rightMin min(rightMin, nums[j]); } }关键问题这个内部循环在最坏情况下会执行多少次考虑一个严格递减数组[5, 4, 3, 2, 1]i0rightMin1nums[0]5≠1不触发i1rightMin1nums[1]4≠1不触发i2rightMin1nums[2]3≠1不触发i3rightMin1nums[3]2≠1不触发i4rightMin1nums[4]1触发扫描后面0个元素这种情况其实还好因为rightMin一直没变。真正的噩梦是递增数组[1, 2, 3, 4, 5]i0rightMin1nums[0]1触发扫描i1到末尾4个元素找到新的rightMin2i1rightMin2nums[1]2触发扫描i1到末尾3个元素找到新的rightMin3i2rightMin3nums[2]3触发扫描i1到末尾2个元素i3rightMin4nums[3]4触发扫描i1到末尾1个元素i4rightMin5nums[4]5触发扫描0个元素总操作数43210 10次约等于n(n-1)/2。对于n100000这就是5×10⁹次操作——超时是必然的。AC版本真正的O(n)再看AC版本vectorint minValue(n); minValue[n - 1] nums[n - 1]; for (int i n - 2; i 0; --i) { minValue[i] min(minValue[i 1], nums[i]); }一次预处理每个位置的后缀最小值已经算好。后续遍历时int maxValue INT_MIN; for (int i 0; i n; i) { maxValue max(maxValue, nums[i]); if (maxValue - minValue[i] k) { return i; } }每个元素只访问常数次总操作数2n对于n100000就是20万次操作快了几个数量级。四、复杂度对比表维度超时版本AC版本时间复杂度O(n²) 最坏O(n)空间复杂度O(1)O(n)n10⁵时操作数≈5×10⁹≈2×10⁵LeetCode状态TLEAC五、为什么会写出超时版本这是一个很典型的认知偏差只看表面循环看到只有一个for就想当然认为是O(n)忽略隐藏循环内部重新扫描的代价被低估平均情况误导可能心想大部分情况不会触发重新扫描但最坏情况是算法分析必须考虑的六、如何避免这类错误1. 识别动态更新的成本当你需要频繁查询区间最值且数据会变化时警惕每次O(n)的重新计算。2. 经典优化思路预处理如本题的后缀数组线段树/树状数组动态区间查询单调栈/队列维护滑动窗口极值堆动态维护最值3. 复杂度分析要严谨不要只数循环层数要计算每条语句在最坏情况下的总执行次数。七、延伸思考如果题目要求动态修改数组那么预处理的后缀数组就不适用了。这时可以考虑线段树O(log n) 查询区间最小值O(log n) 更新分块O(sqrt(n)) 查询平衡时间和空间但本题是静态数组预处理后缀数组是最优解——时间O(n)空间O(n)。八、总结要点说明时间复杂度陷阱隐藏循环可能将O(n)变为O(n²)空间换时间用O(n)空间换取O(n)时间往往是值得的最坏情况分析不能仅凭平均情况或直觉判断复杂度优化思路对区间最值查询预处理是常用且高效的手段最后送给读者一句话写代码时不仅要看有几层循环更要看每条语句执行多少次。真正的复杂度藏在最坏情况的细节里。如果这篇文章对你有帮助欢迎点赞收藏也欢迎在评论区交流讨论.
RELATED

相关推荐

WebScreen - 免费在线的桌面屏保合集

WebScreen - 免费在线的桌面屏保合集

链接:https://pan.quark.cn/s/c3f18db132d8网页屏保,防屏幕长时间不动息屏休眠,也可以保护屏幕,全平台支持。电脑运营ai工具任务,或者其他任务时候,不想电脑息屏,又不想修改全局设置时候可以用这…

📅 2026/11/11 23:34:26
智慧政务服务中心解决方案:从架构设计到落地避坑指南

智慧政务服务中心解决方案:从架构设计到落地避坑指南

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

📅 2026/11/11 23:34:25
开学难受点,未来长一寸

开学难受点,未来长一寸

最近这几天一直再搞开学前的工作 晚上购物它是最最最让我本人无语的,一句话:下次我一定要提早开始准备 所以我现在就在整理要带去大学的东西,早早开始,不要重蹈覆辙,卡点是我最不想要的 开学事项 C语言停滞 ZC最后一课…

📅 2026/11/3 20:09:15
MORE NEWS

更多资讯

📰

宁波电工作业证书查询千万别踩坑:证书过期了不知道怎么复审延期

宁波电工作业证书查询千万别踩坑:证书过期了不知道怎么复审延期 证书过期了不知道怎么复审延期?你不是一个人,很多人在实际工作中都会遇到这个问题。特别是在宁波这样的制造业大市,电工作业证书是许多岗位的“入场券”,一旦过期,不仅影响工作,还可能面…

📰

职业禁忌电工作业怎么考?保姆级教程帮你搞定特种作业证

职业禁忌电工作业怎么考?保姆级教程帮你搞定特种作业证 找工作找不到,就是因为没有特种作业证?这事儿真不是危言耸听。很多电工兄弟一肚子本事,但就是因为没证,被用人单位拒之门外。别急,今天就给你一套保姆级教程,讲清楚职业禁忌电工作业怎么考,考什…

📰

办电工证要去哪里办电子证书查询

鹤壁应届生急需电工证怎么办?2026河南最新政策全知道 你是不是刚毕业就听说找工作必须要有电工证?别急,2026年河南最新政策已经更新, 办电工证要去哪里办…

📰

怀化溆浦县电工证报名全攻略 工地太忙也能搞定官方报名入口

怀化溆浦县电工证报名全攻略 工地太忙也能搞定官方报名入口 工地太忙根本没时间复习考试,这几乎是所有一线施工人员的真实写照,尤其是像怀化溆浦县这类劳务集中地区,电工证作为特种作业操作证,是从事电气作业的“门槛证”。但很多电工师傅因为日常施工任…

📰

盐亭电工证怎么考 证书过期了不知道怎么复审延期怎么报名

盐亭电工证怎么考 证书过期了不知道怎么复审延期怎么报名 证书过期了不知道怎么复审延期,是很多特种作业从业者的真实困境。尤其是在像盐亭这样的地方,电工证不仅是上岗的“通行证”,更是安全作业的“生命线”。如果你现在手里有一张快到期的电工证,又不…

📰

电工证怎样考取正规吗 良心建议给你说清楚

电工证怎样考取正规吗 良心建议给你说清楚 之前考的证在外省能不能转过来?这是很多电工朋友的共同疑问,尤其是在跨省工作或者换城市发展的朋友。我今天就从【电工证怎样考取正规吗】这个角度出发,结合济源应届工程类毕业生的实际情况,给大家讲讲电工证的…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬