LeetCode每日一题:四数相加
题目描述:
给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。
例如:
输入:
A=[ 1 , 2 ]
B=[ -2 , -1
C=[ -1 , 2 ]
D=[ 0 , 2 ]
输出:
2
思路解析:
对于这个问题我们可以将上述四个数组分成两部分来看,即A和B一组,C和D一组,我们分开来看;
- 对于A和B:首先我们可以使用双重for循环,对两个数组进行遍历,在遍历的过程中求得两个数组中任意两个元素可能出现的和的所有值,并将每一个和的相反数与该和出现的次数按照key-value的方式存放到预先定义好的map集合中。
- 对于C和D:采用双重for循环遍历C、D两个数组,遍历到每一个C[k]+D[l],如果C[k]+D[l]的值在map集合中存在,就将map集合中C[k]+D[l]对应的映射值加到结果中,直至遍历结束。
代码实现:
public static int sum(int[] A,int[] B,int[] C,int[] D){
// 遍历A,B数组,求得两个数组和的所有可能性
Map<Integer,Integer> map=new HashMap<>();
int count=0;//记录两个数组中任意两个数的和出现的次数
int result=0;//记录返回结果
for (int i=0;i<A.length;i++){
for (int j=0;j<B.length;j++){
int sum=-(A[i]+B[j]);//将所得的和取反
if (map.containsKey(sum)){//如果map集合中已经存在该sum值
count=map.get(sum)+1;//将该值对应的出现的次数+1
map.replace(sum,count);//用当前的次数替换原来的次数值
}
else {
map.put(sum, 1);//如果map集合中不存在该sum值,就将该值存入到map集合,对应的映射值为1
}
}
}
//遍历C,D数组,求两个数组的和sum如果这个和在map存在就累加
for (int k=0;k<C.length;k++){
for (int l=0;l<D.length;l++){
int sum1=C[k]+D[l];
if (map.containsKey(sum1)){//如果C,D中任意两个数和的值sum1在map集合中存在
result+=map.get(sum1);//在map集合中取出该和sum1的映射值,累加到最后的结果中
}
}
}
return result;//返回累加后的结果值
}