> 文章列表 > LeetCode-454. 四数相加 II

LeetCode-454. 四数相加 II

LeetCode-454. 四数相加 II

目录

    • 题目思路
    • 暴力法
    • 哈希表

题目来源
454. 四数相加 II

题目思路

有三种情况可以考虑

  • HashMap 存一个数组,如 A。然后计算三个数组之和,如 BCD。时间复杂度为:O(n)+O(n^3),得到 O(n^3).
  • HashMap 存三个数组之和,如 ABC。然后计算一个数组,如 D。时间复杂度为:O(n^3)+O(n),得到 O(n^3).
  • HashMap存两个数组之和,如AB。然后计算两个数组之和,如 CD。时间复杂度为:O(n^2)+ O(n^2),得到 O(n^2).

我们肯定选择第三种
首先定义 一个HashMap,key放a和b两数之和,value 放a和b两数之和出现的次数。
遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中。
定义int变量count,用来统计 a+b+c+d = 0 出现的次数。
在遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来。
最后返回统计值 count 就可以了

0-(c+d)
a+b+c+d = 0 
a+b = 0-(c+d)

暴力法

4个for循环,会出现超时情况

class Solution {public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {int ans = 0;for(int i = 0;i<nums1.length;i++){for(int j = 0;j<nums2.length;j++){for(int k = 0;k<nums3.length;k++){for(int l = 0;l<nums4.length;l++){if(nums1[i]+nums2[j]+nums3[k]+nums4[l]==0){ans++;}}}}}return ans;}
}

LeetCode-454. 四数相加 II

哈希表

class Solution {public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {int count = 0;Map<Integer,Integer> map = new HashMap<>();for(int i : nums1){for(int j:nums2){int result = i+j;if(map.containsKey(result)){map.put(result,map.get(result)+1);}else{map.put(result,1);}}}for(int i : nums3){for(int j:nums4){int temp = i + j;if(map.containsKey(0-temp)){count += map.get(0-temp);}}}return count;}
}

LeetCode-454. 四数相加 II