Skip to main content

454 4Sum II

Leetcode

Given four integer arrays nums1, nums2, nums3, and nums4 all of length n, return the number of tuples (i, j, k, l) such that:

0 <= i, j, k, l < n
nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0

Example 1:

Input: nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]
Output: 2
Explanation:
The two tuples are:

1. (0, 0, 0, 1) -> nums1[0] + nums2[0] + nums3[0] + nums4[1] = 1 + (-2) + (-1) + 2 = 0
2. (1, 1, 0, 0) -> nums1[1] + nums2[1] + nums3[0] + nums4[0] = 2 + (-1) + (-1) + 0 = 0

Example 2:

Input: nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0]
Output: 1

计算第 1 个和第 2 个数组所有的组合的和,将数量存入 map 。计算第 3 和第 4 个数组所有组合的和的相反数,如果在 map 中存在,则说明这一对可以和第 1 个数组和第 2 个数组中的 n 对得到和为 0 的结果。

class Solution {
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
HashMap<Integer,Integer> map=new HashMap<>();
for(int i1:nums1){
for(int i2:nums2){
map.put(i1+i2,map.getOrDefault(i1+i2,0)+1);
}
}
int total=0;
for(int i3:nums3){
for(int i4:nums4){
total+=map.getOrDefault(-i3-i4,0);
}
}
return total;
}
}
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
map<int,int> mp;
int sum;
for(int i=0;i<nums1.size();++i){
for(int j=0;j<nums2.size();++j){
sum=nums1[i]+nums2[j];
if(mp.find(sum)!=mp.end()){
mp[sum]=mp[sum]+1;
} else {
mp[sum]=1;
}
}
}
int total=0;
for(int i=0;i<nums3.size();++i){
for(int j=0;j<nums4.size();++j){
sum=-nums3[i]-nums4[j];
if(mp.find(sum)!=mp.end()){
total+=mp[sum];
}
}
}
return total;
}
};
class Solution:
def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
map = {}
for i1 in nums1:
for i2 in nums2:
map[i1+i2] = map.get(i1+i2,0)+1
total = 0
for i3 in nums3:
for i4 in nums4:
total += map.get(-i3-i4,0)
return total