解决思路
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)
