题目链接:454. 四数相加 II - 力扣(LeetCode)
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
//将四个数组分成两组,分别计算两个组的和,得到两个数组分别有n*n个元素,再将其看作两个数组,转化为两数之和
//与两数之和不同的是,该题要记录有多少个元组
//如果记录前两个数组的和出现的次数,但后两个数组的和出现的次数如果也记录到map中,并不是最后结果
//在遍历第二个数组时直接相加
unordered_map<int,int> map;
int temp;
int count=0;
for(int i=0;i<nums1.size();i++)
{
for(int j=0;j<nums2.size();j++)
{
temp=nums1[i]+nums2[j];
if(map.count(0-temp))
{
map[0-temp]++;
}
else
{
map.insert(make_pair(0-temp,1));
}
}
}
for(int i=0;i<nums3.size();i++)
{
for(int j=0;j<nums4.size();j++)
{
temp=nums3[i]+nums4[j];
if(map.count(temp))
{
count+=map[temp];
}
}
}
return count;
}
};
官方题解
class Solution {
public:
int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {
unordered_map<int, int> countAB;
for (int u: A) {
for (int v: B) {
++countAB[u + v];
}
}
int ans = 0;
for (int u: C) {
for (int v: D) {
if (countAB.count(-u - v)) {
ans += countAB[-u - v];
}
}
}
return ans;
}
};