<aside> 💡
思路:将四个数组分为两组,使用map记录nums1和nums2的和(key),以及该和出现的次数(val)
</aside>
// 使用map记录nums1+nums2,使用nums3+nums4对map进行查询
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
unordered_map<int, int> record12;
int ans = 0;
for (int i1 : nums1) {
for (int i2 : nums2) {
auto iter = record12.find(i1 + i2);
if (iter == record12.end())
// 两数的和作为key,其出现的次数作为val存入map
record12.insert({ i1 + i2, 1 });
else
++(iter->second);
iter = record12.find(i1 + i2);
}
}
for (int i3 : nums3) {
for (int i4 : nums4) {
auto iter = record12.find(-(i3 + i4));
if (iter != record12.end() && iter->second > 0) {
// 一个解的所有实现方法全部加上
ans += iter->second;
}
}
}
return ans;
}
第二版,与上面思路相同
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
// <两数和, 出现的次数>
unordered_map<int, int> sum12;
unordered_map<int, int> sum34;
for (int i = 0; i < nums1.size(); ++i) {
for (int j = 0; j < nums2.size(); ++j) {
int sum = nums1[i] + nums2[j];
auto it = sum12.find(sum);
if (it == sum12.end()) {
sum12.insert({ sum, 1 });
} else {
++(it->second);
}
}
}
for (int i = 0; i < nums3.size(); ++i) {
for (int j = 0; j < nums4.size(); ++j) {
int sum = nums3[i] + nums4[j];
auto it = sum34.find(sum);
if (it == sum34.end()) {
sum34.insert({ sum, 1 });
}
else {
++(it->second);
}
}
}
int ans = 0;
for (auto item : sum12) {
auto it = sum34.find(-item.first);
if (it != sum34.end()) {
ans += item.second * it->second;
}
}
return ans;
}