题目:454. 四数相加 II
给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。
为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 。所有整数的范围在 -228 到 228 - 1 之间,最终结果不会超过 231 - 1 。
思路:用空间换取时间,四个数组的时间复杂度太高
代码:
class Solution {
public int fourSumCount(int[] A, int[] B, int[] C, int[] D) {
if(A.length<1) return 0;
HashMap<Integer, Integer> map = new HashMap<>();
int res = 0;
//将四个数组两两分成连个数组,先将两个数组的值保存在hashmap中,方便查找
for (int x : A)
for (int y : B)
map.put(x + y, map.getOrDefault(x + y, 0) + 1);
for (int x : C)
for (int y : D)
//然后遍历C D数组,查看map数组中是否有该值得相反数,如果有相反数就加上该相反数的haspmap中的值
if (map.containsKey(-x - y)) {
res += map.get(-x - y);
}
return res;
}
}
类似题目:
之和为一个固顶的数可以借助数组的帮助
三数之和为0
两数之和为target的数
之和与target最近的数(只能够遍历)
都要避免重复数值的问题