解决思路
Map
查找表
将D中的元素放入查找表,这样只需要遍历A、B、C数组即可
在D中查找0-A[i]-B[j]-C[k]
时间复杂度O(n^3)
改进
将C+D的每一种可能都放入查找表
此时该查找表可能较大,如果使用hashmap,依然可以在O(1)复杂度内查找删除
使用map,记录C+D的出现次数
时间复杂度O(n^2 )
public int fourSumCount(int[] A, int[] B, int[] C, int[] D) {
Map<Integer,Integer> map = new HashMap<>();
//将C+D作为key,C+D出现的次数作为value放在map中
for(int i:C){
for(int j:D){
//记录C+D每一种可能出现的次数
int value = map.getOrDefault(i+j, 0);
map.put(i+j,value+1);
}
}
int res = 0;
for(int i:A){
for(int j:B){
//判断0-A-B是否出现在map中 如果出现则累加C+D出现的次数
if(map.containsKey(-i-j)){
res += map.get(-i-j);
}
}
}
return res;
}
//time O(n^2)
//space O(n^2)