暴力解法是会超时的,这里选择将问题分解,对四个数组进行两两分别处理。即考虑nums1+nums2的结果与nums3+nums4的结果相加是否为0。
用第一个双循环求nums1+nums2的和sum,第二个双循环求num3+num4的和。
重点来了,如何去count和为0出现的次数?由于既要求和,又需要记录每一种和对应的次数,联想到键值对,我们可以用HashMap试一试。
第一个双循环,把所有求到的和sum丢到HashMap中,key为和的值,value为该和出现的次数;
由于最终和为0,只需要第二个双循环求的和为-sum就可以啦,并不需要再来一个HashMap了。在第二个双循环中寻找和为-sum的情况,并计数,over!
class Solution {
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
//四数相加,两两数组做一组处理
//key为nums1[]+nums2[]的值,value为加得这个值的次数
HashMap<Integer,Integer> map=new HashMap<>();
int count=0;
//先对前两个数组进行处理
for (int i = 0; i < nums1.length; i++) {
for (int j = 0; j < nums2.length; j++) {
int sum=nums1[i]+nums2[j];
//若map中没有该sum则加入,value置为1
if (map.get(sum)==null){
map.put(sum,1);
}
//若map中已经有该sum,则value+1,用put一个新的键值对挤掉原来的
else {
Integer integer = map.get(sum);
map.put(sum,integer+1);
}
}
}
//对后两个数组进行处理
for (int i = 0; i < nums3.length; i++) {
for (int j = 0; j < nums4.length; j++) {
int sum=nums3[i]+nums4[j];
Integer integer = map.get((0 - sum));
if (integer!=null){
count=count+integer;
}
}
}
return count;
}
}
时间复杂度: O(n^2)
空间复杂度: O(n^2), 最坏情况下nums1和nums2的值各不相同,相加产生n平方个不同的sum。