LeetCode两数之和(TwoSum)解决方案报错:索引越界问题排查
问题分析与修复
核心错误原因
你的代码触发「索引越界」的根本问题是混淆了数组元素值与索引,再加上循环逻辑混乱,具体问题拆解如下:
1. 循环遍历的是元素值而非索引
for x in nums 和 for y in nums 这两个循环,遍历的是数组中的元素值,不是元素的索引。比如示例输入nums = [2,7,11,15],x会依次取2、7、11、15,当你执行nums[x]时,相当于用元素值作为索引访问数组——比如x=7时,数组最大索引仅为3,直接触发索引越界。
2. 手动递增循环变量完全多余
for循环本身会自动完成迭代,你在循环内部手动执行x+=1和y+=1属于画蛇添足,会让x、y的值彻底混乱,进一步加剧索引越界的概率。
3. 空列表直接赋值索引会触发额外错误
你初始化了空列表solutions = [],之后直接执行solutions[0] = x,这会因为列表中没有索引0对应的元素,触发另一次索引越界(当前报错在第8行,这个问题是后续会暴露的)。
4. 可能重复使用同一个元素
代码没有限制两个索引不能相同,比如如果nums里有一个2、target=4,代码会返回同一个索引两次,不符合题目隐含的「不能使用同一个元素两次」的要求。
修复后的代码
以下是修正了上述问题的两种实现:
基础双重索引循环版本(易理解)
class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: n = len(nums) for i in range(n): for j in range(i + 1, n): # 从i+1开始,避免重复检查和使用同一元素 if nums[i] + nums[j] == target: return [i, j] return [] # 题目保证有解,此处为兜底逻辑
哈希表优化版本(时间复杂度O(n))
class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: num_map = {} # 存储元素值到索引的映射 for idx, num in enumerate(nums): complement = target - num if complement in num_map: return [num_map[complement], idx] num_map[num] = idx return []
内容的提问来源于stack exchange,提问作者Filippo Piombino
相关产品推荐
相关产品推荐

