LeetCode[454]四数相加Ⅱ
思路
如果我们暴力求解一定是n的四次方,那我们暴力肯定是过不去的,我们能简化四次方吗?
可以,我第一次尝试把四次方简化成二次方,但是我们一共四个数组,怎么简化成二次方,那我们就把四个数组看成两个数组,这样我们就可以使用二次方进行求解了,每两个数组进行一次n方。这道题也是一道哈希题,我们面对哈希题就可以使用数组,set和map,因为我们需要统计有几个原组和前两个数组的和,所以我们使用map来搞。
前两个数组使用n方进行和的相加存入map,如果存在相同值,我们value就++
后两个数组使用n方进行和的相加,如果我们想结果=0,那么前两个数组和后两个数组的和一定是相反数,如果相加=0了,那么我们就将一开始存的value相加到结果中就行了。
因为这个value代表了前两个数组一共有多少种结果。
代码:
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 = 0; i < nums1.length; i++) {
for (int j = 0; j < nums2.length; j++) {
int num = nums1[i] + nums2[j];
map.put(num, map.getOrDefault(num, 0) + 1);
}
}
for (int i = 0; i < nums3.length; i++) {
for (int j = 0; j < nums4.length; j++) {
int num = nums3[i] + nums4[j];
if (map.containsKey(-num)) {
count += map.get(-num);
}
}
}
return count;
}
}