LeetCode JavaScript 219.存在重复元素II 超时问题排查
超时原因分析
console.log触发超时的核心原因是它带来的额外开销远大于循环内的运算本身,具体如下:
- JS引擎执行数值比较、算术运算的速度极快,但
console.log是同步IO操作:每次调用都要完成参数序列化、写入标准输出流、对接判题环境的日志收集模块,单次执行耗时是普通数值运算的数百到上千倍。 - 你的双重循环时间复杂度是O(n²),当测试用例是长度上万的无重复数组时,循环总执行次数会达到千万甚至亿级。没有打印语句时,纯计算逻辑刚好能卡在判题时间阈值内跑完;每轮循环加一次
console.log,总耗时会直接暴涨几十上百倍,必然触发时间超限。
你本地跑三个示例时数组长度最多只有6,循环总次数不到15次,打印的开销完全感知不到,但遇到大数据量边界用例时,这部分开销会被平方级放大。
额外提一句,即使去掉打印语句,这套双重循环逻辑遇到长度10万级别的数组还是会超时,更优的实现是用哈希表存储元素上次出现的索引,把时间复杂度降到O(n),参考代码:
var containsNearbyDuplicate = function(nums, k) { const lastPos = new Map(); for (let i = 0; i < nums.length; i++) { const cur = nums[i]; if (lastPos.has(cur) && i - lastPos.get(cur) <= k) { return true; } lastPos.set(cur, i); } return false; };
内容的提问来源于stack exchange,提问作者ccc6
相关产品推荐
相关产品推荐

