知道应该用哈希表,但是刚开始确实是没想明白该怎么做,其实也是很简单的。
思路:
1.把四个数组,分成两组,前两个和后两个共两组,遍历数组,把每组内的元素全部加和,并把加和后的值作为key分别保存在两个哈希map中,value为这个和出现的次数。
2. 遍历其中一个哈希map1,得到每一个元素的key和value, 判断0 - 当前元素key 是否存在于另一个哈希map2中。然后两个value值相乘即可得到一次的组合数。例如:得到的key值为-1,value为3,也就是说前两个数组中,相加等于-1的组合共有3个,然后查看0-(-1) = 1是否存在于另一个map2。假如存在,同时value值为2,也就是说后两个数组中,相加等于1的组合有2个,所以根据排列组合我们可以知道共有 2*3 = 6中不同的组合可以使 -1 + 1=0。
class Solution {
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
HashMap<Integer, Integer> map1 = new HashMap<>();
HashMap<Integer, Integer> map2 = new HashMap<>();
for (int i = 0; i < nums1.length; i++) {
for (int j = 0; j < nums1.length; j++) {
map1.put(nums1[i]+nums2[j],map1.getOrDefault(nums1[i]+nums2[j],0)+1);
map2.put(nums3[i]+nums4[j],map2.getOrDefault(nums3[i]+nums4[j],0)+1);
}
}
int count = 0;
for(HashMap.Entry<Integer, Integer> entry : map1.entrySet()){
Integer map1Key = entry.getKey();
Integer map1Value = entry.getValue();
if(map2.get(0 - map1Key) != null){
count += map2.get(0 - map1Key) * map1Value;
}
}
return count;
}
}