【leetcode】454. 4Sum II 总结
【方法一】 「思路」 近似暴力解法,将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; }
上一篇:
IDEA上Java项目控制台中文乱码