本题源自LeetCode
------------------------------------------
思路1 :回溯法
超时
代码;
vector<vector<int> > fourSum(vector<int> &num, int target) {
vector<vector<int>> result;
if(num.size()==0)
return result;
vector<int> path;
sort(num.begin(),num.end());
backPath(result,num,path,target,0);
return result;
}
void backPath(vector<vector<int>>& result,vector<int>& num,vector<int> &path,int target,int start){
if(path.size()==4&&target==0){
result.push_back(path);
return;
}
int pre=INT_MAX;
for(int i=start;i<num.size();i++){
if(pre==num[i])
continue;
path.push_back(num[i]);
backPath(result,num,path,target-num[i],start+1);
path.pop_back();
}
}
思路2:
非递归;先计算俩个值再从剩下的数中选俩个。
代码:
vector<vector<int> > fourSum(vector<int> &num, int target) {
vector<vector<int>> result;
if(num.size()==0)
return result;
int n=num.size();
sort(num.begin(),num.end()); //对数组排序
for(int i=0;i<n-3;i++){
for(int j=i+1;j<n;j++){
int sum=target-num[i]-num[j]; //先计算俩个值的和
int start=j+1; //再剩余的数中找到俩个值满足和等于给定值
int end=n-1;
while(start<end){
while(start<end&&num[start]+num[end]>sum)
end--;
if(start==end)
break;
if(num[start]+num[end]==sum){
vector<int> tmp={num[i],num[j],num[start],num[end]};
result.push_back(tmp);
while(start<end&&num[start]==num[start+1])
start++;
}
start++;
}
while(j<n-1&&num[j]==num[j+1]) //避免重复的值
j++;
}
while(i<n-1&&num[i]==num[i+1])
i++;
}
return result;
}