哈希表 | 454.四数相加II 、383.赎金信
📋目录
✅ 454.四数相加II
✅ 383.赎金信
454.四数相加II
⏰ 1.解题思路
- 定义一个map,key用来存放a和b的两数之和,value用来存两数之和出现的次数
- 将四个数组两两分组,nums1和nums2、nums3 和 nums4
- 定义变量count,统计四数之和为0 的次数
- 在遍历nums3 和 nums4,如果 0-(c+d) 其实等于 a+b,在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来。
💻 2.代码
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @param {number[]} nums3
* @param {number[]} nums4
* @return {number}
*/
var fourSumCount = function(nums1, nums2, nums3, nums4) {
const twoSumMap = new Map();
// 计数
let count = 0;
// 统计nums1和nums2数组元素之和出现次数,放到map
for (const n1 of nums1){
for (const n1 of nums2){
const sum = n1 + n2;
twoSumMap.set(sum,(twoSumMap.get(sum) || 0 +1));
}
}
// 接着找到 0-(c+d) 在map中出现的次数,把map中key对应的value值的次数统计出来
for (const n3 of nums3){
for (const n4 of nums4){
const sum = n3+n4;
count += (twoSumMap.get(sum) || 0);
}
}
return count;
};
🍯 3.知识点补充
🍊 Map.get(key), 通过key或得对应key的value,在本题中value是两数之和出现的次数
383.赎金信(有效字母异位词的拓展题)
⏰ 1.解题思路
- 快速判断元素有没有出现在集合中,使用哈希法
- 因为题目中只有小写字母,体量较小,可以使用数组
- 遍历magazine里面的所有字母,将其存到数组中,再遍历ransomNote中的字母,因为是magazine中字母组成的,所以一旦出现了数组中没有的字母,则立即返回false
💻 2.代码
/**
* @param {string} ransomNote
* @param {string} magazine
* @return {boolean}
*/
var canConstruct = function(ransomNote, magazine) {
const StrArr = new Array(26).fill(0),
base = "a".charCodeAt(0);
//记录magazine里面的字母出现次数
for (const s of magazine){
strArr[s.charCodeAt - base]++;
}
for (const s of ransomNote){
const index = s.charCodeAt - base;
//如果出现没记录过的字母,就直接返回false
if(!strArr[index]) return false;
strArr[index] --
}
return true
};
🍯 3.知识点补充
🍊自增和自减 对其操作数进行自加一或自减一,--x:返回减一之后的值; x--:返回减一之前的值。