You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何三数之和最接近问题中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 04:10:02