给定四个包含整数的数组列表 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 。所有整数的范围在 -2^28 到 2^28 - 1 之间,最终结果不会超过 2^31 - 1 。
例如:
输入:
- A = [ 1, 2]
- B = [-2,-1]
- C = [-1, 2]
- D = [ 0, 2]
输出:
2
解释:
两个元组如下:
- (0, 0, 0, 1) -> A[0] + B[0] + C[0] + D[1] = 1 + (-2) + (-1) + 2 = 0
- (1, 1, 0, 0) -> A[1] + B[1] + C[0] + D[0] = 2 + (-1) + (-1) + 0 = 0
package Hash;
import java.util.HashMap;
public class LeetCode454_01 {
public static void main(String[] args) {
int[] A = {1, 2};
int[] B = {-2, -1};
int[] C = {-1, 2};
int[] D = {0, 2};
System.out.println(fourSumCount(A, B, C, D));
}
public static int fourSumCount(int[] A,int[] B,int[] C,int[] D){
int count = 0;
HashMap<Integer, Integer> map = new HashMap<>();
for (int i:A) {
for (int j : B) {
int sum = i+j;
map.put(sum,map.getOrDefault(sum,0)+1);
/*尝试从哈希表map中获取键为sum=i+j的值。getOrDefault方法有两个参数,第一个参数是要获取的键,
第二个参数是如果键不存在时返回的默认值。在这个例子中,如果键sum存在于map中,那么方法会返回该键对应的值;
如果键sum不存在于map中,那么方法会返回0。
map.getOrDefault(sum, 0) + 1:获取到键sum的值后,将其加1。
这是因为我们在遍历A和B数组中的元素,对于每一对 (i, j),我们都会计算它们的和并将其存储到哈希表中,
同时更新这个和出现的次数。如果这个和已经存在于哈希表中,那么我们就在原来的基础上加1;
如果这个和还不存在于哈希表中,那么我们就从 1 开始计数。
所以,map.getOrDefault(sum, 0) + 1 的作用就是更新哈希表中键 a + b 的值,
即更新和sum出现的次数。*/
}
}
for (int i : C) {
for (int j : D) {
count += map.getOrDefault((0-i-j),0);
/*(0-i-j):这是我们要在哈希表中查找的键。我们正在寻找所有可能的四元组(i,j,k,l)使得A[i]+B[j]+C[k]+D[l]=0。
在前面的代码中,我们已经计算了所有可能的A[i]+B[j]的和sum,并将这些和存储在了哈希表 map 中。
现在,我们正在遍历数组C和D,对于每一对 (i,j),我们计算它们的和i+j,然后取反(即 -),
因为我们需要找到满足A[i]+B[j]+C[k]+D[l]=0的四元组,所以我们要在哈希表中查找与-(i+j)相等的键。
map.getOrDefault((0-i-j), 0):尝试从哈希表map中获取键为-(i+j) 的值。
如果这个键存在于哈希表中,那么getOrDefault方法会返回该键对应的值;
如果这个键不存在于哈希表中,那么 getOrDefault 方法会返回默认值 0。*/
}
}
return count;
}
}