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

3Sum题解的变量值为什么看起来没有按预期顺序变化?

3Sum代码打印异常问题原因分析
  • 你观察到的现象并非同一轮num迭代下的start指针回退,本质是num=0的for循环迭代已经完全执行结束,已经进入了num=1的新一轮迭代。

具体执行过程拆解

  1. 数组预处理结果
    你的输入[-1, 0, 1,2,-1,-4]排序后为 [-4, -1, -1, 0, 1, 2]。
  2. 第一轮for循环(num=0,对应值-4)执行逻辑
    这一轮首先初始化start=1、end=5,然后进入内层while循环,经过两次迭代后start就会大于end,内层循环完全终止。你看到的第一组打印是这一轮的第二次while迭代输出,本次迭代结束后本轮for循环就执行完毕了。
  3. 第二轮for循环(num=1,对应值-1)初始化逻辑
    代码中start, end = num + 1, len(nums) - 1这行是写在for循环内部、while循环外部的,每一轮新的num迭代都会重新给start、end赋值,不会复用前一轮for循环的指针值。所以进入num=1的迭代后,start被重新赋值为2(对应值-1),end被重新赋值为5(对应值2),就出现了你看到的第二组打印结果。

额外代码逻辑问题提示

你当前的代码存在漏洞:去重逻辑和双指针同时移动的代码写在了curSum判断分支之外,不管三数之和是大于、小于还是等于0,都会同时移动左右指针,会漏掉大量合法解。正确写法是仅当找到和为0的组合时,才执行去重和双指针同时移动的操作,其余情况仅移动单个指针:

def threeSum(nums):
    res = []
    nums.sort()
    for i in range(len(nums) - 2):
        if i > 0 and nums[i] == nums[i-1]:
            continue
        left, right = i + 1, len(nums) - 1
        while left < right:
            cur_sum = nums[i] + nums[left] + nums[right]
            if cur_sum < 0:
                left += 1
            elif cur_sum > 0:
                right -= 1
            else:
                res.append((nums[i], nums[left], nums[right]))
                while left < right and nums[left] == nums[left+1]:
                    left += 1
                while left < right and nums[right] == nums[right-1]:
                    right -= 1
                left += 1
                right -= 1
    return res

内容的提问来源于stack exchange,提问作者kayvera

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:06:02