注册一亩三分地论坛,查看更多干货!
您需要 登录 才可以下载或查看附件。没有帐号?注册账号
x
之前3Sum也有这个报错,原因是没跳过重复元素。现在4Sum我觉得能优化的都考虑了,还是报Output Limit Exceeded,弄了近俩小时,整个人都不好了。于是在此求大神指导,感激不尽!
P.S.:我用的是O(N^3)的算法。
P.S.:含调试部分,所以请不要在意那个static。
附源代码如下:
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
static vector<vector<int> > fourSum(vector<int> &num) {
vector<vector<int> > ans;
int len=num.size();
if(len<4)
return ans;
qsort(num, 0, len-1);
if(num[0]>0 || num[len-1]<0)
return ans;
for(int i=0; i<len-4 && num[i]<=0; i++){
if(i!=0 && num[i]==num[i-1])
continue;
for(int j=i+1; j<len-3; j++){
if(j!=i+1 && num[j]==num[j-1])
continue;
int l=j+1, r=len-1;
while(l<r){
int temp=num[i]+num[j]+num[l]+num[r];
if(temp<0){
while(l<r-1 && num[l]==num[l+1])l++;
l++;
}
else if(temp>0){
while(l<r-1 && num[r]==num[r-1])r--;
r--;
}
else{
vector<int> vt;
vt.push_back(num[i]);
vt.push_back(num[j]);
vt.push_back(num[l]);
vt.push_back(num[r]);
ans.push_back(vt);
while(l<r-1 && num[l]==num[l+1])l++;
l++;
while(l<r-1 && num[r]==num[r-1])r--;
r--;
}
}
}
}
return ans;
}
static void qsort(vector<int> &n, int l, int r){
if(l>=r)
return;
int mid=(l+r)/2;
int pl=l, pr=r, x=n[mid];
n[mid]=n[l];
while(pl<pr){
while(pl<pr&&n[pr]>=x)
pr--;
if(pl<pr)
n[pl]=n[pr];
while(pl<pr&&n[pl]<=x)
pl++;
if(pl<pr)
n[pr]=n[pl];
}
n[pl]=x;
qsort(n,l,pl);
qsort(n,pr+1,r);
}
};
int main(){
vector<int> v;
for(int i=0; i<2; i++){
v.push_back(-i-1);
}
for(int i=0; i<2; i++){
v.push_back(i+1);
}
for(int i=0; i<2222; i++){
v.push_back(0);
}
vector<vector<int> > ans;
ans=Solution::fourSum(v);
for(int i=0; i<ans.size(); i++){
vector<int> vtemp=ans.at(i);
for(int j=0; j<vtemp.size(); j++)
cout<<vtemp[j]<<" ";
cout<<endl;
}
}
|