为何三数之和最接近问题中return语句报索引越界而print正常?
问题分析与修复
1. 循环遍历逻辑错误(核心问题)
你写的for x in nums for y in nums for z in nums是遍历数组的元素值而非索引,这会导致两个致命问题:
- 如果数组里有负数或数值超过数组长度,
nums[x]会直接触发索引错误; - 就算数值刚好是合法索引,也会错误跳过不同位置的相同元素(比如数组
[1,1,2]中,两个1是不同位置的元素,但数值相等会被条件x != y != z !=x排除)。
正确的做法是遍历数组索引:
solution = [sum([nums[x], nums[y], nums[z]]) for x in range(len(nums)) for y in range(len(nums)) for z in range(len(nums)) if x != y and y != z and x != z]
2. 排序操作未生效
sorted(solution, key=itemgetter(1))会返回新的排序列表,但你没有将结果赋值给solution,原列表仍保持无序状态。必须修改为:
solution = sorted(solution, key=itemgetter(1))
3. 空列表边界处理
如果输入数组长度小于3,三重循环生成的solution会是空列表,访问solution[0]必然触发IndexError。尽管题目要求找三个整数,理论上输入数组长度≥3,但代码最好加上边界判断:
if len(nums) < 3: return sum(nums) if nums else 0
修复后的完整代码
class Solution: def threeSumClosest(self, nums: List[int], target: int) -> int: from operator import itemgetter if len(nums) < 3: return sum(nums) if nums else 0 # 遍历索引而非元素值 solution = [sum([nums[x], nums[y], nums[z]]) for x in range(len(nums)) for y in range(len(nums)) for z in range(len(nums)) if x != y and y != z and x != z] solution = [[x, abs(x-target)] for x in solution] # 接收排序后的结果 solution = sorted(solution, key=itemgetter(1)) return solution[0][0]
关于print正常但return报错的疑问
大概率是测试用例差异导致:你本地测试用的数组长度≥3且元素值刚好是合法索引,所以print能输出;但在线测试平台用了更严格的用例(比如含负数、长度不足3、有重复元素等),导致solution为空列表,或者在生成solution时就触发了索引错误,你误以为是return语句的问题。
额外优化:降低时间复杂度
当前三重循环的时间复杂度是O(n³),大数组会超时。可以先排序数组,用双指针法将时间复杂度降到O(n²):
class Solution: def threeSumClosest(self, nums: List[int], target: int) -> int: nums.sort() n = len(nums) closest_sum = nums[0] + nums[1] + nums[2] for i in range(n-2): left = i + 1 right = n - 1 while left < right: current_sum = nums[i] + nums[left] + nums[right] # 更新最接近的和 if abs(current_sum - target) < abs(closest_sum - target): closest_sum = current_sum # 根据当前和与目标值的关系移动指针 if current_sum < target: left += 1 elif current_sum > target: right -= 1 else: # 找到完全匹配的和,直接返回 return current_sum return closest_sum
内容的提问来源于stack exchange,提问作者m. lekk
相关产品推荐
相关产品推荐

