查看题目
解题思路此题还是比较有意思的,区别于普通的四数之和,普通的四数之和不能使用哈希法,而这道题目是四个独立的数组,只要找到A[i] + B[j] + C[k] + D[l] = 0就可以,不用考虑有重复的四个元素相加等于0的情况,所以相对于题目18. 四数之和,题目15.三数之和,还是简单了不少!
主要的解题思路:
- 首先定义 一个map,key放a和b两数之和,value 放a和b两数之和出现的次数。
- 遍历nums1和大nums2数组,统计两个数组元素之和,和出现的次数,放到map中。
- 定义int变量count,用来统计a+b+c+d = 0 出现的次数。
- 在遍历nums3和nums4数组,找到如果 0-(c+d) 在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来。
- 最后返回统计值 count 就可以了。
简单来说还是采用的两数之和的思想,只不过在比较两数之和的时候,需要使用使用双重for循环构造第一个数(包括第二个数),构造出来之后操作与两数之和类似。
class Solution {
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
Map map = new HashMap<>();
int temp = 0;
int res = 0;
//统计两个数组中的元素之和,同时统计出现的次数,放入map
for(int i : nums1){
for(int j : nums2){
temp = i + j;
if(map.containsKey(temp)){
//这里不能直接将key为temp的值直接加1,
//而先要用get将value提取出来加一之后,put重新复制进去。
map.put(temp , map.get(temp) + 1);
} else {
map.put(temp , 1);
}
}
}
//统计剩余的两个元素的和,在map中找是否存在相加为0的情况,同时记录次数
for(int i : nums3){
for(int j : nums4){
temp = i + j;
if(map.containsKey(0 - temp)){
//使用res加上已经记录的次数
res += map.get(0 - temp);
}
}
}
return res;
}
}



