题目:
今天这题思路历程大概是这样:
四个数组循环,发现要n^4的时间复杂度。
于是思考怎么化简。
很容易就能想到两两分组相加比对,可以将时间复杂度降到n^2。
怎么做呢?
我一开始用的是两个二维矩阵,分别存储对应【i】和【j】的相加值,然后再对二维矩阵里面的元素逐一遍历。
但是,这样代码量很大,而且时间复杂度也会相对更高。
于是,就有了哈希表的优化做法。
对A和B的和建立一张哈希表,然后对C和B的和去检索是否存在相反数,存在的话有几个即可。编码简单,而且也会比两个二维矩阵的做法快。
C++附测试:
#include<iostream>
#include<vector>
#include<unordered_map>
using namespace std;
class Solution {
public:
int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {
unordered_map<int,int> countAB;
for(int u:A)
{
for(int v:B)
{
++countAB[u+v];//将相加元素放入哈希表中,并统计出现次数
}
}
int ans = 0;
for(int u:C)
{
for(int v:D)
{
if(countAB.count(-u-v))
ans += countAB[-u-v];
}
}
return ans;
}
};
int main()
{
vector<int> A = {1,2};
vector<int> B = {-2,-1};
vector<int> C = {-1,2};
vector<int> D = {0,2};
Solution s;
int ans = s.fourSumCount(A,B,C,D);
cout<<ans<<endl;
}
这里要多说一句,unordered_map好像是C++11才开始有的,在引入之前先调整编译器让它支持C++11