算法day17 四数相加
题目描述

思路:分治+哈希
如果我们采用暴力的解法,则需要嵌套四层for循环,这里我们优化,将四个数组两两分成一组,每次以两层for循环嵌套,我们的目标是要找出a+b+c+d = 0这样的元组的个数,所以在第一组,我们将可能的a+b添加到哈希表中,随后在第二个二层循环里,我们只需判断-(c+d)= a+b,相等的,我们将对应hash的值增加到cnt上(这里需要注意,符合条件的a+b可能有多组,但是当映射到hash中时,它们的个数将会以值的形式存储),最后返回即可。
代码如下
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
int n = nums1.size();
int sum;
int cnt = 0;
unordered_map<int,int> hash;
for(int i = 0;i < n;i++){
for(int j = 0;j < n;j++){
sum = nums1[i] + nums2[j];
hash[sum]++;
}
}
for(int k:nums3){
for(int v:nums4){
sum = -(k + v);
if(hash.find(sum)!=hash.end()){
cnt += hash[sum];
}
}
}
return cnt;
}
时间复杂度:O(n^2)
空间复杂度:O(k)
END
浙公网安备 33010602011771号