454. 四数相加 II


  1. 四数相加 II

难度中等174

给定四个包含整数的数组列表 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 。

例如:

输入:
A = [ 1, 2]
B = [-2,-1]
C = [-1, 2]
D = [ 0, 2]

输出:
2


// hashMap存储AB的组合的值,如果出现相同值value+1,说明当前某一个值,可以有
// 多种匹配的方案。CD通过计算相反的值,通过查找Map中是否有就可以判断是否可以计算
// 出多种匹配0的方法次数。
// 时间复杂度为O(N^2)
public int fourSumCount(int[] A, int[] B, int[] C, int[] D) {
Map<Integer,Integer> map = new HashMap<>();
int res = 0;
for(int i=0;i<A.length;i++){
for(int j=0;j<B.length;j++){
int ab = A[i]+B[j];
if(map.containsKey(ab)){
map.put(ab,map.get(ab)+1);
}else{
map.put(ab,1);
}
}
}

for(int i=0;i<C.length;i++){
for(int j=0;j<D.length;j++){
int cd = -(C[i]+D[j]);
if(map.containsKey(cd)){
res+=map.get(cd);
}
}
}
return res;
}