代码随想录算法训练营第07天 | 454.四数相加II 、383. 赎金信、315. 三数之和 、18. 四数之和

文章介绍了利用哈希表解决编程题目中的求和问题,如四数相加II、赎金信和三数之和。对于四数之和,关键在于用哈希表存储两数组的和及出现次数;赎金信问题同样利用哈希表检查字母是否足够;三数之和则采用双指针法,处理可能的重复值。
摘要由CSDN通过智能技术生成

题目

初见思路

454.四数相加II

直接看了解析,想通的话还是比较好理解的。用一个map来记录两个数组的和以及出现次数, key为i+j, value是i+j在这两个数组中出现的次数。

for(int a : nums1){
	for(int b : nums2){
		++umap[a+b];
	}
}

因为a+b+c+d = 0所以a+b = -(c+d) , 我们只需要再找出另外两个数组中-(c+d) 的key在map中存在就行了。

int count = 0; // a+b+c+d
for(int c : nums3){
	for(int d : nums4){
		if(umap.find(-(c + d)) != umap.end()){ // if find
			count += umap[-(c + d)];
		}
	}
}
return count;

383. 赎金信

直接用了一个unordered map,先存入magazine中出现的字母(key),和出现的次数(count)。然后再判断ransomNote中是否出现过并且次数还大于0,(出现一次在map中减一次)。

315. 三数之和

这道题用2 pointer好解决一些。

18. 四数之和

和三数之和差不多,细节上复杂点。

更新思路

454.四数相加II

注意map中的value要全部加上count,(有不同的组合符合条件)

383. 赎金信

代码随想录中通过数组来对应小写字母的脚标,空间上要比hash map省一些。

315. 三数之和

a+b+c=0,b和c作为左右两个pointer,和a加起来的值等于0。需要注意a,b,c都可能出现重复的情况,a需要用这种方式来跳过重复的值,以免出现跳过部分正确值的情况

if(i > 0 && nums[i] == nums[i - 1]){
	continue;
}

18. 四数之和

多一个固定的值,多一层for loop。

今日总结

学习时长

收获

看情况使用方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值