给定四个包含整数的数组列表 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[i]+B[j]出现的所有可能,首先想到使用HashSet,但由于A[i]+B[j]的值可能不止出现一次,且若匹配每次出现的值都会使结果+1,因此采用HashMap存储,HashMap的key为可能出现的值,value为值出现的次数。然后求C[i]+D[j]的值,判断HashMap中是否存在以-(C[i]+D[j])为key的键值对,若存在说明匹配,key对应的value即为新增的结果数。
时间复杂度:O(n2),空间复杂度:O(n)
class Solution {
public int fourSumCount(int[] A, int[] B, int[] C, int[] D) {
/*定义哈希表存储A和B相加的所有可能结果,及其出现的次数*/
HashMap<Integer, Integer> hashMap = new HashMap<>();
for (int i = 0; i < A.length; i++) {
for (int j = 0; j < B.length; j++) {
int sum = A[i] + B[j];
if (hashMap.containsKey(sum)) {
hashMap.put(sum, hashMap.get(sum)+1);
} else {
hashMap.put(sum, 1);
}
}
}
int res = 0;
for (int i = 0; i < C.length; i++) {
for (int j = 0; j < D.length; j++) {
int sum = C[i] + D[j];
if (hashMap.containsKey(-sum)) {
/*若匹配,则会增加hashMap.get(-sum)个结果*/
res += hashMap.get(-sum);
}
}
}
return res;
}
}