在代码随想录第15题中,对三数之和三元组进行去重时,出现了这样一行代码
nums[i]!=nums[i-1]
是为了对和为0的三元组进行去重。
为什么要这样写,为什么敢这样写,下面进行分析。
如上图所示,本题采用了双指针法。i为从前往后遍历数组的指针,对于每个i,数组的配对区会利用双指针left和right进行遍历。
但是本题要求不能出现重复的三元组,例如[[0,0,0],[0,0,0]] 这种结果是不可取的。
当数组排好序后,nums[i]!=nums[i-1]一定能保证不会有重复的三元组。
周文王打仗时,会把军队分为左军,中军,右军。i可以理解为当前作为左军的人员,i-1可以理解为上一次战斗作为左军的人员,当左军都不同,整个军队也会不同,这就是马哲里的部分不同,整体也会不同。这时三元组不同,也不会出现重复的三元组。
但是nums[i]!=nums[i-1]这个条件是不是太过严苛,会不会导致遗漏三元组,答案是不会。因为在上一次遍历到i-1时,已经从图中遍历区穷举了所有可能构成三元组的可能组合。而如果nums[i]=nums[i-1],可以理解为这时nums[i]开头的三元组集合只会是nums[i-1]开头三元组集合的子集,因为遍历区缩小了。那么再去枚举以nums[i]开头的三元组就是冗余的了。
综上nums[i-1]!=nums[i]既能保证不存在重复三元组,又不会太过严苛导致遗漏三元组,总之非常好用。