哈希表 | 454.四数相加II 、383.赎金信 

📋目录

    ✅ 454.四数相加II 

    ✅  383.赎金信 


 454.四数相加II 

⏰ 1.解题思路

  1. 定义一个map,key用来存放a和b的两数之和,value用来存两数之和出现的次数
  2. 将四个数组两两分组,nums1和nums2、nums3 和 nums4
  3. 定义变量count,统计四数之和为0 的次数
  4. 在遍历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.解题思路

  1. 快速判断元素有没有出现在集合中,使用哈希法
  2. 因为题目中只有小写字母,体量较小,可以使用数组
  3. 遍历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--:返回减一之前的值。

 

posted @ 2023-05-09 23:40  karen哈哈哈  阅读(10)  评论(0编辑  收藏  举报