454. 四数相加 II
给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:
0 <= i, j, k, l < n
nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0
示例 1:
输入:nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]
输出:2
解释:
两个元组如下:
- (0, 0, 0, 1) -> nums1[0] + nums2[0] + nums3[0] + nums4[1] = 1 + (-2) + (-1) + 2 = 0
- (1, 1, 0, 0) -> nums1[1] + nums2[1] + nums3[0] + nums4[0] = 2 + (-1) + (-1) + 0 = 0
示例 2:
输入:nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0]
输出:1
思考
方法一:暴利枚举法
这个方法时间复杂度 o ( n 4 ) o(n^4) o(n4),不推荐
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
int count=0;
for (int i = 0; i < nums1.length; i++) {
for (int i1 = 0; i1 < nums2.length; i1++) {
for (int i2 = 0; i2 < nums3.length; i2++) {
for (int i3 = 0; i3 < nums4.length; i3++) {
if((nums1[i]+nums2[i1]+nums3[i2]+nums4[i3])==0) count++;
}
}
}
}
return count;
}
方法二:哈希表
时间复杂度
o
(
n
2
)
o(n^2)
o(n2)
-
首先考虑两数之和,之前我们利用哈希表
- 当我们遍历数组到
x
时,我们其实要寻找对应得target-x
- 所以我们可以利用哈希表快速获取
target-x
是否存在 - 每当遍历一个数时,
哈希表<Intger,Intger>
保存value,count
- 当我们遍历数组到
-
考虑四个数之和,数组ABCD
- 创建两个哈希表
- 一个哈希表存放其中AB数组的任意数之和
- 一个哈希表存放其中CD数组的任意数之和
- 遍历一个哈希表获取
key
:n ,当另一个哈希表存在key
: (0-n)时count=count+map2.get(integer)*map1.get(integer)
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) { HashMap<Integer,Integer> map1=new HashMap<>(); HashMap<Integer,Integer> map2=new HashMap<>(); for (int i = 0; i < nums1.length; i++) { for (int i1 = 0; i1 < nums2.length; i1++) { if(!map1.containsKey(nums1[i]+nums2[i1])) map1.put(nums1[i]+nums2[i1],1); else map1.put(nums1[i]+nums2[i1],map1.get(nums1[i]+nums2[i1])+1); } } for (int i = 0; i < nums3.length; i++) { for (int i1 = 0; i1 < nums4.length; i1++) { if(!map2.containsKey(nums3[i]+nums4[i1])) map2.put(nums3[i]+nums4[i1],1); else map2.put(nums3[i]+nums4[i1],map2.get(nums3[i]+nums4[i1])+1); } } int count=0; for (Integer integer : map1.keySet()) { if(map2.containsKey(0-integer)) count=count+map2.get(integer)*map1.get(integer); } return count; }