题目
https://leetcode-cn.com/problems/4sum-ii/
思路
第一反应必是暴力,四个for循环解决。但据说运行的时候甚至会卡住,毕竟是O(n的四次方)。
那么就想到用数学中相反数的方式。
用HashMap先存入两个数组相加后的值存入到key中,其中可能会有重复的key,value就用于记录各个key对应的次数。显然两组是时间复杂度最低的。O(n的平方)
再用后两组计算其中的值,找到有-(和)=之前map存入的值,而输出的个数由各个value相加来决定
eg: 前两组key=2,value=3 找到后两组的和为-2,-2的相反数就是2,这时候result+=2。
代码实现以及书写会出现的问题
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
Map<Integer,Integer> map = new HashMap<>();
int result = 0;
//求出 A 和 B 任意两数之和 sumAB,以 sumAB 为 key,sumAB 出现的次数为 value,存入 hashmap 中
for (int i:nums1) {
for (int j:nums2) {
if(map.containsKey(i+j)) {
map.put(i+j,map.get(i+j)+1);
}
else {map.put(i+j,1);}
}
}
//然后计算 C 和 D 中任意两数之和的相反数 sumCD,在 hashmap 中查找是否存在 key 为 sumCD。
for (int i:nums3) {
for (int j:nums4) {
int sum = -i-j;
if (map.containsKey(sum)){
result+=map.get(-i-j);
}
}
}
return result;
}
- result+=map.get(-i-j); 容易写成i+j(一定要明白,相反数才在map中)
- if(map.containsKey(i+j)) {
map.put(i+j,map.get(i+j)+1);
}
只有在有的情况下才在对应value上+1