
最初的想法:用两个map来记录相加结果
class Solution {
public:
int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {
unordered_map<int, int> m;
unordered_map<int, int> n;
for(int a : A){
for(int b : B){
m[a + b]++;
}
}
for(int c : C){
for(int d : D){
n[c + d]++;
}
}
int cnt = 0;
for(auto &item : m){
if(n.find(0-item.first) != n.end()){
cnt += n[0-item.first] * item.second;
}
}
return cnt;
}
};
改进写法:在第二个大循环里就可以进行判断了。
遍历大C和大D数组时,找到如果 0-(c+d) 在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来。其思想和两数之和差不多。
class Solution {
public:
int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {
unordered_map<int, int> m;
for(int a : A){
for(int b : B){
m[a + b]++;
}
}
int cnt = 0;
for(int c : C){
for(int d : D){
if(m.find(0 - c - d) != m.end()){
cnt += m[0 - c - d];
}
}
}
return cnt;
}
};