如何优化我的Python版Two Sum代码?解决LeetCode超时问题
针对你的Two Sum超时问题的优化建议
首先得说,你的暴力解法思路是完全正确的——遍历每个元素,再检查后面的元素能不能和它凑成target,这种方法在小数据量下完全没问题,也难怪前19个测试用例都过了。但最后那个超时的测试用例应该是个超大数组,O(n²)的时间复杂度扛不住,咱们来一步步优化你的思路:
先分析你当前代码的核心问题
你的代码用了两层嵌套循环,时间复杂度是O(n²)。当数组长度n很大的时候(比如104甚至更大),总操作次数会达到108级别,这肯定会触发超时限制。另外,你在内层循环找到结果后break,但外层循环还会继续执行(因为return是在所有循环结束后),这其实没必要——题目明确说每个输入恰好有一个解,找到后应该立刻返回,不用再做无用的遍历。
基于你的思路的具体优化方向
咱们不用完全推翻你的“找配对元素”的核心思路,只是把“找”的效率提上去:
用哈希表(字典)替代内层循环的遍历查找
你现在的内层循环是逐个检查后面的元素,这个过程可以用哈希表来加速。哈希表的查找时间是O(1),远快于遍历。具体来说:- 遍历数组的时候,维护一个哈希表,键是已经遍历过的元素值,值是对应的下标。
- 对于当前元素
nums[i],计算需要的配对值:complement = target - nums[i]。 - 检查这个complement是否在哈希表里:如果在,说明之前已经遍历过这个值,直接返回
[哈希表里的下标, i];如果不在,就把当前元素和下标存进哈希表,继续遍历。
这个方法的时间复杂度直接降到O(n),大数据量下完全不会超时。
调整循环的终止逻辑
你现在的代码里,找到结果后只break了内层循环,外层还会继续跑。记得找到符合条件的下标对后,立刻return结果,不要再继续循环了——反正题目说只有一个解,多跑都是浪费时间。
再回顾下Two Sum问题的核心要求(方便确认思路)
给定整数数组,返回两个数的下标,使它们的和等于目标值。假设每个输入恰好有一个解,且不能使用同一元素两次。
示例:Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1]
用哈希表的方法完全符合要求:因为我们只存已经遍历过的元素,所以找到的配对元素下标一定小于当前元素的下标,满足x < y,也不会重复使用同一个元素。
内容的提问来源于stack exchange,提问作者Classic Schmosby
相关产品推荐
相关产品推荐

