题目
初见思路
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。
今日总结
学习时长
收获
看情况使用方法。