解法:用unordered_map
一采用分为两组,unordered_map 存一组,另一组和 unordered_map 进行比对。
这样的话情况就可以分为三种:
unordered_map 存一个数组,如 A。然后计算三个数组之和,如 BCD。时间复杂度为:O(n)+O(n^3),得到 O(n^3).
unordered_map 存三个数组之和,如 ABC。然后计算一个数组,如 D。时间复杂度为:O(n^3)+O(n),得到 O(n^3).
unordered_map存两个数组之和,如AB。然后计算两个数组之和,如 CD。时间复杂度为:O(n^2)+O(n^2),得到 O(n^2).
根据第二点我们可以得出要存两个数组算两个数组。
我们以存 AB 两数组之和为例。首先求出 A 和 B 任意两数之和 sumAB,以 sumAB 为 key,sumAB 出现的次数为 value,存入 unordered_map中。
然后计算 C 和 D 中任意两数之和的相反数 sumCD,在 unordered_map中查找是否存在 key 为 sumCD。
算法时间复杂度为 O(n2)。
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
unordered_map<int,int> myMap;
int count=0;
int m=nums1.size(),n=nums2.size(),p=nums3.size(),q=nums4.size();
for(int a:nums1){ //比较新奇的用法
for(int b:nums2){
myMap[ a + b ] ++;
}
}
for(int c:nums3){
for(int d:nums4){
if(myMap.find(-(c+d))!=myMap.end()){
count+=myMap[-(c+d)];
}
}
}
return count;
}
};
解题步骤:
- 首先定义 一个unordered_map,key放a和b两数之和,value 放a和b两数之和出现的次数。
- 遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中。
- 定义int变量count,用来统计 a+b+c+d = 0 出现的次数。
- 在遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来。
- 最后返回统计值 count 就可以了