【方法一】
「思路」
近似暴力解法,将AB数组中元素依次相加得到数组ab,CD数组中元素依次相加得到数组cd,若ab中的元素加cd中的元素和为0,则结果加1.
「结果」
Time Limit Exceeded
「代码」
int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {
int n=A.size();
int nn=n*n;
int p=0,q=0,ans=0;
if(n==0)
{
return ans;
}
else
{
int ab[nn],cd[nn];
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
ab[p]=A[i]+B[j];
p++;
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cd[q]=C[i]+D[j];
q++;
}
}
for(int i=0;i<nn;i++)
{
for(int j=0;j<nn;j++)
{
if(ab[i]+cd[j]==0)
{
ans++;
}
}
}
return ans;
}
}
【方法二】
「思路」
同样将数组其分为两组,用map的代替for的两重循环。
「结果」
Runtime: 1278 ms
「代码」
int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {
int n=A.size();
int nn=n*n;
map<int,int>ab;
int p=0,q=0,ans=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
int sum=A[i]+B[j];
if(ab.count(sum)==0)
{
ab.insert(pair<int,int>(sum,1));
}
else
ab[sum]++;
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
int sum=-(C[i]+D[j]);
ans=ans+ab[sum];
}
}
return ans;
}
【方法三】
「思路」
同样将数组分为两组A+B和C+D,对两个新数组排序,之后通过设定前后指针用夹击的方法找到ab+cd=0的次数。当找到一次ab+cd=0时,通过while循环找到有多少组相同的结果(即在ab,cd中分别找到相同数字的次数并相乘)。最后累加得到最终结果。
「结果」
Runtime: 126 ms
「代码」
int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {
int i,j,n=A.size(),p=0,ans=0,aa,cc,nn=n*n;
if(n==0){return ans;}
int ab[nn],cd[nn];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
ab[p]=A[i]+B[j],cd[p++]=C[i]+D[j];
sort(ab,ab+p);
sort(cd,cd+p);
int f=0,b=p-1;
while(f<p && b>=0)
{
if(ab[f]+cd[b]<0)
{
f++;
}
else if(ab[f]+cd[b]>0)
{
b--;
}
else
{
aa=1,cc=1;
while(++f<p && ab[f]==ab[f-1]){aa++;}
while(--b>=0 && cd[b]==cd[b+1]){cc++;}
ans+=cc*aa;
}
}
return ans;
}