思路如下:
1、如果采用4层for循环那么时间复杂度会很高
2、可以考虑将A、B之和与该和出现的次数用一个HashMap存储,然后对遍历C、D之和,如果C、D之和是HashMap中某一个键的相反数,那么就取出该键key的值value,即出现的次数。
3、求出所有的次数和即为结果。
class Solution {
public int fourSumCount(int[] A, int[] B, int[] C, int[] D) {
//哈希表key:A、B的和,value:A、B之和出现的次数
HashMap<Integer,Integer> map=new HashMap<>();
for(int i=0;i<A.length;i++){
for(int j=0;j<B.length;j++){
//记录A、B的和及其出现次数
int sumAB=A[i]+B[j];
int times=map.getOrDefault(sumAB,0)+1;
map.put(sumAB,times);
}
}
//定义和为0的元组数
int res=0;
for(int i=0;i<C.length;i++){
for(int j=0;j<D.length;j++){
int sumCD=C[i]+D[j];
//如果sumCD与map中的值和为0
if(map.containsKey(-sumCD)){
//添加元组数
res+=map.get(-sumCD);
}
}
}
return res;
}
}
原题地址:
454. 四数相加 II