理解去重判断中的边界条件
这个问题问的是在 fourSum 函数中两处去重判断的条件为什么要设定特定的边界值:
if i > 0 and nums[i] == nums[i - 1]if j > i + 1 and nums[j] == nums[j - 1]
关键解释
这两个条件的目的是为了跳过重复元素,确保结果中不包含重复的四元组,同时边界检查是为了防止数组越界。
第一个条件 if i > 0 and nums[i] == nums[i - 1]
i > 0是因为我们需要确保有一个前一个元素nums[i-1]可以比较。如果i = 0,那么i-1会导致索引越界。- 当前元素
nums[i]与前一个元素nums[i-1]相同时,跳过当前元素,因为使用相同的数字作为第一个数会导致重复的四元组。
第二个条件 if j > i + 1 and nums[j] == nums[j - 1]
j > i + 1确保j不是i后的第一个元素。因为j的初始值是i+1,所以只有当j至少是i+2时,才需要考虑跳过重复。- 当
j = i+1时,它是该轮循环中的第一个元素,没有必要跳过。
快速记忆的方法
- 首元素判断 : 对于第一个元素,只需确保不是第一轮 (
i > 0) 就可以和前一个比较。 - 内层循环判断 : 对于内层循环,需要确保不是该轮的第一个元素 (
j > i+1) 才进行比较。
简单记忆:"外层看是否为0,内层看是否为起点的下一个"
实际例子
考虑数组 [1,1,2,2,3,3],target = 8:
- 当
i = 0时,我们处理第一个1 - 当
i = 1时,由于nums[1] = nums[0],我们跳过(避免重复) - 类似地,在内部循环中,当我们处理第一个
2后,会跳过第二个2
这样可以确保结果中不会有重复的四元组。