题目
难度:中等难度
见官网leetcode454题 四数相加||
思路
不能单纯暴力法,会导致500^4的时间复杂度,铁定超时。
考虑把ABCD分为两组:AB和CD,把A[i]+B[j]的和存入哈希表中(时间复杂度:n^2);再计算t=C[k]+D[m] (时间复杂度:n^2),在哈希表中查找是否有-t,有的话,则可满足:A[i]+B[j]+C[k]+D[m]=t-t=0.
整体的时间复杂度:O(n^2).
c++代码
class Solution {
public:
int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {
if (A.empty() || B.empty() || C.empty() || D.empty()) return 0;
int count;
unordered_map<int, int>mp;//A[i]+B[j],次数
for (auto i : A)
for (auto j : B)
mp[i + j]++; //n^2
for(auto k:C)
for (auto m : D) {
int t = k + m; //C[k]+D[m]的值,看mp中是否有相反数
count += mp[-t]; //n^2 加上相反数出现的次数,即有几个组合
}
return count;
}
};