为什么我的Two Sum问题代码在输入[3,2,3]时运行失败
问题原因
list.index()方法的固有特性:该方法只会返回列表中第一个匹配元素的下标,当列表中存在重复元素(如示例中的两个3)时,无论实际访问的是第0位还是第2位的3,nums.index(3)始终返回0,因此两个3相加的场景会被nums.index(i) != nums.index(j)的判断直接过滤,无法得到正确结果。- 逻辑冗余且参数错误:你使用了三重完全没必要的循环,twoSum仅需要两层下标遍历即可实现暴力求解。同时你示例代码中默认target设为9,但
[3,2,3]中任意两个元素相加最大值为6,永远无法匹配target,自然不会有返回结果。 - 下标遍历逻辑错误:你没有直接遍历下标,而是先遍历元素再反查下标,本身就会因为重复元素的存在导致下标获取错误,完全没必要这么做。
修复方案
首先给出暴力解法的修复版本,适合理解逻辑:
def twoSum(nums = [3, 2, 3], target = 6): # 直接遍历下标,跳过index()方法避免重复元素的下标获取错误 for i in range(len(nums)): # j从i+1开始,避免重复匹配同一个元素 for j in range(i + 1, len(nums)): if nums[i] + nums[j] == target: return [i, j] print(twoSum()) # 输出结果:[0, 2]
如果需要更高的时间效率,可以使用哈希表存储已遍历元素的下标,时间复杂度优化到O(n):
def twoSum(nums = [3, 2, 3], target = 6): # 哈希表存储已遍历元素的值对应的下标 seen = {} for idx, num in enumerate(nums): # 计算当前元素需要匹配的补数 complement = target - num if complement in seen: return [seen[complement], idx] # 存下当前元素的下标,遇到后续重复元素时会覆盖,不影响结果 seen[num] = idx print(twoSum()) # 输出结果:[0, 2]
内容的提问来源于stack exchange,提问作者wehguidg
相关产品推荐
相关产品推荐

