题目表述
给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:
0 <= i, j, k, l < n nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0
来源:力扣(LeetCode) 链接:leetcode.cn/problems/4s…
题目分析
- 整体思路:每两个数组求和。第一对数组求和后放入哈希表map。第二对数组求和时,去map中查询是否有这样的target,使得和为0。
- 为什那么选择map做哈希表?
因为需要存储第一对数组的和,及其个数(比如第一对数组中有两数和为9,但是能找到三对这样的元素)。
代码
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
std::unordered_map<int,int> map1;
int count = 0;
for(int i=0;i<nums1.size();i++){ //建立map1
for(int j=0;j<nums2.size();j++){
int sum1 = nums1[i]+nums2[j];
auto iterator = map1.find(sum1);
if(iterator !=map1.end()){
iterator->second++;
}else{
map1.insert(pair<int, int>(sum1,1));
}
}
}
for(int i=0;i<nums3.size();i++){
for(int j=0;j<nums4.size();j++){
int target = -(nums3[i]+nums4[j]);
auto iterator2 = map1.find(target);
if(iterator2 != map1.end()){
count += iterator2->second;
}
}
}
return count;
\
}