image.png

解决思路

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 )

  1. public int fourSumCount(int[] A, int[] B, int[] C, int[] D) {
  2. Map<Integer,Integer> map = new HashMap<>();
  3. //将C+D作为key,C+D出现的次数作为value放在map中
  4. for(int i:C){
  5. for(int j:D){
  6. //记录C+D每一种可能出现的次数
  7. int value = map.getOrDefault(i+j, 0);
  8. map.put(i+j,value+1);
  9. }
  10. }
  11. int res = 0;
  12. for(int i:A){
  13. for(int j:B){
  14. //判断0-A-B是否出现在map中 如果出现则累加C+D出现的次数
  15. if(map.containsKey(-i-j)){
  16. res += map.get(-i-j);
  17. }
  18. }
  19. }
  20. return res;
  21. }
  22. //time O(n^2)
  23. //space O(n^2)