题目:给你四个整数数组 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链接: 四数相加
题解一:
1.使用暴力循环,但是时间复杂度是超过了的
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
int size = nums1.size();
int total = 0;
for(int i=0;i<size;i++){
for(int j=0;j<size;j++){
for(int u=0;u<size;u++){
for(int y=0;y<size;y++){
if(nums1[i]+nums2[j]+nums3[u]+nums4[y]==0){
total++;
}
}
}
}
}
return total;
}
};
题解二:哈希表
1.哈希表的解法是将两两数组分开来,这样就可以将时间复杂度缩短为O(n^2),关键还是那句判断if(umap.find()…
class Solution {
public:
int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {
unordered_map<int, int> umap; //key:a+b的数值,value:a+b数值出现的次数
// 遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中
for (int a : A) {
for (int b : B) {
umap[a + b]++;
}
}
int count = 0; // 统计a+b+c+d = 0 出现的次数
// 再遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就把map中key对应的value也就是出现次数统计出来。
for (int c : C) {
for (int d : D) {
if (umap.find(0 - (c + d)) != umap.end()) {
count += umap[0 - (c + d)];
}
}
}
return count;
}
};