Leetcode:454.四数相加II

222 阅读1分钟

力扣题目链接

题意:

给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:

0 <= i, j, k, l < n nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0  

image.png

思路(leetcode官方):分组+哈希表

  • 我们可以将四个数组分成两部分,A和B为一组,C和D为一组
  • 对于A和B,我们使用二重循环对它们进行遍历,得到所有A|i|+B|j|的值并存入哈希映射中。对于哈希映射中的每个键值对,每个键表示一种A|i|+B|j|,对应的值为A|i|+B|j|出现的次数
  • 对于C和D,我们同样使用二重循环对它们进行遍历。当遍历到C|k|+D|l|时,若-(C|k|+D|l|)出现在哈希映射中,那么将-(C|k|+D|l|)对应的值累加进答案中
  • 最终即可得到满足 A|i|+B|j|+C|k|+D|l|=0 的四元组数目
var fourSumCount = function(nums1, nums2, nums3, nums4) {
    let ABmap = new Map()
    let count = 0
    for (let n1 of nums1){
        for(let n2 of nums2){
            const sum = n1 + n2
            ABmap.set(sum,(ABmap.get(sum)||0)+1)
        }
    } 

    for (let n3 of nums3){
        for(let n4 of nums4){
            const sum = n3 + n4
            count += (ABmap.get(0-sum)||0)
        }
    }
    return count
};