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 。

思路:
四个数之和咱们可以给他转换成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};