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

63 阅读1分钟

454. 四数相加 II

代码随想录 (programmercarl.com)

解题

这道题由于是从四个数组中找相加等于0的个数,不用考虑重复的四个元素相加等于0的情况,所以可以使用哈希表来解决。

解题步骤:

  1. 定义哈希表,存放a,b两数之和和出现的次数(遍历A、B两个数组)
  2. 遍历C、D两个数组,统计c、d之和为(0-(a+b))出现的次数

代码如下:

var fourSumCount = function(nums1, nums2, nums3, nums4) {
    const twoSumMap = new Map() 
    let count = 0
    for(let n1 of nums1) {
        for(let n2 of nums2) {
            let sum = n1 + n2
            twoSumMap.set(sum,(twoSumMap.get(sum) || 0) + 1)
        }
    }
    for(let n3 of nums3) {
        for(let n4 of nums4) {
            let sum = n3 + n4
            count += (twoSumMap.get(0 - sum) || 0)
        }
    }
    return count
};

383.赎金信

分析

这道题有两个需要注意的点

  1. magazines里面的字母不能重复利用。
  2. 两个字符串只含有小写字母

根据这两个特性,我们可以想到使用哈希表来完成

解题

由于在本题的情况下,使用map的空间消耗要比数组大,我们可以使用数组来模拟哈希表实现。

代码如下:

var canConstruct = function(ransomNote, magazine) {
    const strArr = new Array(26).fill(0)
    let base = 'a'.charCodeAt()
    for(let i of magazine) {
        strArr[i.charCodeAt() - base]++
    }
    for(let i of ransomNote) {
        if(!strArr[i.charCodeAt() - base]) return false
        strArr[i.charCodeAt() - base]--
    }
    return true
};

15.三数之和

分析

这道题的主要难点在于不能包含重复的三元组,对于使用哈希表来解题的话,很难去重。看了题解后学习了用指针的方法解决本题,但是其中的去重依旧得好好琢磨。

解题

过几天再刷一遍再写题解