代码随想录二刷|第三章:哈希表

文章讨论了解决编程问题中的三数之和和四数之和,强调使用排序、双指针法以及去重技巧,包括针对特定目标值的判断、溢出处理和数组去重的改进。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

15.三数之和

1、使用哈希法去重很麻烦,因此用排序+双指针法
2、对a去重:
nums[i] == nums[i-1]
举例:{-1,-1,2} 如果写nums[i] == nums[i+1]就会跳过这一个解
2、对b去重:
while (right > left && nums[right] == nums[right - 1]) right–;
对c去重:
while (right > left && nums[left] == nums[left + 1]) left++;
举例:{0,-1,-1,-1,-1,1,1,1,1}
3、对b和c去重的逻辑要放在收获结果集的下面,否则{0,0,0,0}这样的就一个结果也不会收集了。并且要和收集结果在一个if里面。
找到答案后还要进行双指针的收缩。

18.四数之和

1、 不要判断nums[k] > target 就返回了,三数之和 可以通过 nums[i] > 0 就返回了,因为 0 已经是确定的数了,四数之和这道题目 target是任意值。
举例:[-4, -3, -2, -1],target = -10
逻辑应该变成nums[i] > target && (nums[i] >=0 || target >= 0)
惯性思维是两数相加会变得更大,其实两个负数相加会变得更小
二级剪枝:

if (nums[k] + nums[i] > target && nums[i] >= 0) {
    break;
}

2、nums[k] + nums[i] + nums[left] + nums[right] > target 会溢出,因此要用long型存储
long sum = (long)nums[i] + nums[j] + nums[left] + nums[right];
是给long加括号,不是给后面的加括号
3、对b去重:
if (j > i + 1 && nums[j] == nums[j-1]) continue;
要从i + 2开始

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值