LeetCode 1.两数之和:Python代码在target=10时无正确结果求解
问题分析与解决方案
核心问题原因
你的代码在target=10时失效,本质是循环中直接修改原数组+引用复用导致遍历逻辑彻底混乱:
list = array并没有创建新数组,只是让list指向原数组的内存地址,所以list.remove(n)实际是在修改原array。- 外层
for n in array循环依赖数组的迭代器,但循环过程中原数组不断被移除元素,迭代器的遍历顺序被打乱:
当target=10时,初始数组是[1,6,3,4]:- 第一次循环取
n=1,执行remove(1)后原数组变成[6,3,4],内层循环找不到1和其他数的和为10,循环结束。 - 外层循环继续迭代时,迭代器会跳过
6(因为原数组长度变化,迭代器指针位置错位),直接取到3。 - 处理
n=3时移除3,数组变成[6,4],内层循环找不到和为10的数。 - 最后迭代到
4,移除4后数组只剩[6],依然找不到结果,最终无输出。
- 第一次循环取
此外,你的代码还偏离了题目要求:题目需要返回索引,但你只输出了数值;且找到结果后再次移除元素的操作完全多余,只会加剧数组的混乱。
修正方案
方案1:哈希表法(最优,时间复杂度O(n))
用哈希表存储已遍历元素的索引,每次计算当前元素的补数(target - 当前元素),如果补数在哈希表中,直接返回对应的两个索引:
def twosum(nums, target): num_index_map = {} for idx, num in enumerate(nums): complement = target - num if complement in num_index_map: return [num_index_map[complement], idx] num_index_map[num] = idx # 测试示例 array = [1,6,3,4] target = 10 print(twosum(array, target)) # 输出 [1, 3],对应6和4的索引
方案2:双重索引循环(直观,时间复杂度O(n²))
通过索引遍历,避免修改原数组,确保每个元素只和后面的元素配对:
def twosum(nums, target): for i in range(len(nums)): for j in range(i + 1, len(nums)): if nums[i] + nums[j] == target: return [i, j] # 测试示例 array = [1,6,3,4] target = 10 print(twosum(array, target)) # 输出 [1, 3]
内容的提问来源于stack exchange,提问作者Callane
相关产品推荐
相关产品推荐

