418 字
2 分钟
算法之四数之和Ⅱ

454.四数字相加Ⅱ

给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。

为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 。所有整数的范围在 -228 到 228 - 1 之间,最终结果不会超过 231 - 1 。

image-20210614145011013

思路:

四个数之和咱们可以给他转换成2数之和,这里因为是4个数组,两两组合,之后用Map存储和值,因为既然要

使得 A[i] + B[j] + C[k] + D[l] = 0,换个思路就是使得 A[i] + B[j] = -C[k] - D[l],AB一组遍历存键值,CD再去遍历找到键值相等的,那就是一组,或者多组,因为AB可能有多种情况,CD也是

/**
* @param {number[]} A
* @param {number[]} B
* @param {number[]} C
* @param {number[]} D
* @return {number}
*/
var fourSumCount = function (A, B, C, D) {
let h = new Map()
let r = 0
//遍历前两个参数,在map中以键值对方式添加所有可能的值
//key值为-(a+b),当C D数组中的c+d=-(a+b)时候,说明组合起来会是0
//key值存在的时候就+1,不存在就set为1
for (var a of A) {
for (var b of B) {
if (h.get(0 - a - b)) {
h.set(0 - a - b, h.get(0 - a - b) + 1)
} else {
h.set(0 - a - b, 1)
}
}
}
//C D中的值有匹配的话就在返回结果中加上key对应的value
for (var c of C) {
for (var d of D) {
if (h.has(c + d)) {
r += h.get(c + d)
}
}
}
return r
};
算法之四数之和Ⅱ
https://nollieleo.github.io/posts/算法之四数之和ⅱ/
作者
翁先森
发布于
2021-06-14
许可协议
CC BY-NC-SA 4.0