这道题的意思是,给出ABCD四个数组,数组大小都一样为n,从四个数组中分别抽出一个数,使得四个数相加等于0,问有多少种组合方法。
这道题一开始没思路,后来看了大神做法,才觉得很巧妙。我们如果把A和B的两两之和都求出来,在哈希表中建立两数之和跟其出现次数之间的映射,那么我们再遍历C和D中任意两个数之和,我们只要看哈希表存不存在这两数之和的相反数就行了。
class Solution {
public:
int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {
int n = A.size();
unordered_map<int, int> m;
int res = 0;
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < n; ++j)
{
m[A[i] + B[j]]++;
}
}
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < n; ++j)
{
int x = -C[i] - D[j];
res += m[x];
}
}
return res;
}
};