本题的意思是给定四个长度相同的整数数组,对它们分别给定四个下标,使得这四个下标对应的数加起来为0,求满足这样条件的下标有多少组。
我利用map这个数据结构的特点来解决此题。将前两个数组的元素两两相加,将这个和放入第一个map中,如果遇到相同的和,则增加map中那个和的次数;对于后两个数组和第二个map,进行相同的操作。然后遍历第一个map,对第一个map中所有的和,在第二个map中寻找其相反数,然后将两者的次数相乘,累加到结果中,表示这两个和相加为0的情况总共有这么多组下标。遍历完后,累加完的结果即为所求。
class Solution {
public:
int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {
unordered_map<int, int> sum1, sum2;
int n = A.size();
for (int i = 0; i < n; ++i) {
for(int j = 0; j < n; ++j) {
++sum1[A[i] + B[j]];
++sum2[C[i] + D[j]];
}
}
int count = 0;
for (unordered_map<int, int>::iterator iter_ = sum1.begin(); iter_ != sum1.end(); ++iter_) {
unordered_map<int, int>::iterator iter_1 = sum2.find(-iter_ -> first);
if (iter_1 != sum2.end()) {
count += iter_ -> second * iter_1 -> second;
}
}
return count;
}
};