3Sum题解的变量值为什么看起来没有按预期顺序变化?
3Sum代码打印异常问题原因分析
- 你观察到的现象并非同一轮
num迭代下的start指针回退,本质是num=0的for循环迭代已经完全执行结束,已经进入了num=1的新一轮迭代。
具体执行过程拆解
- 数组预处理结果
你的输入[-1, 0, 1,2,-1,-4]排序后为 [-4, -1, -1, 0, 1, 2]。 - 第一轮
for循环(num=0,对应值-4)执行逻辑
这一轮首先初始化start=1、end=5,然后进入内层while循环,经过两次迭代后start就会大于end,内层循环完全终止。你看到的第一组打印是这一轮的第二次while迭代输出,本次迭代结束后本轮for循环就执行完毕了。 - 第二轮
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
相关产品推荐
相关产品推荐

