您的位置:首页 > 其它

给定一个n个整数的数组S,是否存在S中的4个数,使得a + b + c + d = target。 在数组中找出所有唯一的四元组,给出目标的总和。

2017-11-07 11:12 633 查看
本题源自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;
}

9bc8
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐