C++ Can';t以递归方式处理重复项;“组合总和”;方法
问题:给定一个向量,找到所有唯一的三元组,使a+b+c=0(并以向量向量的形式返回它们) 以下代码几乎可以工作:它可以找到所有可能的三元组,包括具有重复项的三元组和冗余的三元组(即:[0,1,-1]和[-1,0,1]),因此对于以下情况: [-1,0,1,2,-1,-4] 它返回[-1,0,1],-1,-1,2],但也会错误地返回[0,0,0],[2,2,-4]等 代码:C++ Can';t以递归方式处理重复项;“组合总和”;方法,c++,recursion,combinations,C++,Recursion,Combinations,问题:给定一个向量,找到所有唯一的三元组,使a+b+c=0(并以向量向量的形式返回它们) 以下代码几乎可以工作:它可以找到所有可能的三元组,包括具有重复项的三元组和冗余的三元组(即:[0,1,-1]和[-1,0,1]),因此对于以下情况: [-1,0,1,2,-1,-4] 它返回[-1,0,1],-1,-1,2],但也会错误地返回[0,0,0],[2,2,-4]等 代码: 在递归调用之前,但它不起作用我强烈建议您花点额外的精力将其转化为可运行的程序,以便潜在的回答者可以运行并试用它。这通常是值得
在递归调用之前,但它不起作用我强烈建议您花点额外的精力将其转化为可运行的程序,以便潜在的回答者可以运行并试用它。这通常是值得花费时间的。你有什么理由相信额外增加一行可以解决你的问题?只是好奇。我会先对向量进行排序。@WhozCraig我想我可以避免将相同的值重新包含一个以上,基本上每次都会减小向量的大小
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
vector<int> temp;
temp={};
res={};
if(nums.size()<3)
return res;
fillVector(nums,res,temp);
return res;
}
void fillVector(vector<int> nums, vector<vector<int>>& ans, vector<int>& temp, int sum=0, int beg=0){
//if I find a triplet a+b+c=0, add it to the result
if(sum==0 && temp.size()==3){
ans.push_back(temp);
return;
}
//if the triplet returns a value !=0, don't add to the result
if(temp.size()==3)
return;
for(int i=beg;i<nums.size();++i){
int newSum=sum+nums[i];
temp.push_back(nums[i]);
fillVector(nums,ans,temp,newSum,i);
temp.pop_back();
}
}
nums.erase(nums.begin()+beg);