给你四个整数数组 nums1
、nums2
、nums3
和 nums4
,数组长度都是 n
,请你计算有多少个元组 (i, j, k, l)
能满足:
0 <= i, j, k, l < n
nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0
方法一:
双层for循环,将nums1、nums2的所有元素和的可能求出来,用<key, value>表示<sum,sum出现的次数>
再次双层for时,nums3、nums4和与nums1、nums2相反时,取出这个<sum出现的次数>,将这些<sum出现的次数>求和到ans中,返回即可。
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4){
Map<Integer, Integer> map1 = new HashMap<>();
int n = nums1.length;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
int sum = nums1[i] + nums[j];
if(map1.containsKey(sum)){
int value = map1.get(sum)
map1.put(sum, ++value);
} else {
map1.put(sum, 1);
}
}
}
int ans = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
int sum = ( nums3[i] + nums4[j] ) * (-1);
if(map1.containsKey(sum)) ans += map1.get(sum);
}
}
return ans;
}
简化:
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
// 计算nums1 nums2和有哪些种,并记录每种的次数
Map<Integer, Integer> map1 = new HashMap<>();
int n = nums1.length;
for(int i : nums1){
for(int j : nums2){
int sum = i + j;
// ket - sum value --次数
map1.put(sum, map1.getOrDefault(sum, 0) + 1 );
// map1.getOrDefault(sum, 0) + 1
// 如果存在sum这个key就返回它的value,不存在就返回0
// +1 代表,如果存在sum这个key就value++,不存在就加入一个,value设置为1
// if(map1.containsKey(sum)){
// int value = map1.get(sum);
// map1.put(sum, ++value);
// } else {
// map1.put(sum, 1);
// }
}
}
int ans = 0;
//Map<Integer, Integer> map2 = new HashMap<>();
for(int i : nums3){
for(int j : nums4){
int sum = -i - j;
if(map1.containsKey(sum)) ans += map1.get(sum);
}
}
return ans;
}