代码随想录第15题三数之和去重理解

在代码随想录第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]既能保证不存在重复三元组,又不会太过严苛导致遗漏三元组,总之非常好用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值