C++ Leetcode#15:3sum--避免重复
供参考的问题陈述: 给定一个由n个整数组成的数组S,S中是否有元素a、b、c,使得a+b+c=0?查找数组中所有唯一的三元组,该数组的和为零 注意:解决方案集不得包含重复的三元组 例如,给定数组S=[-1,0,1,2,-1,-4] 解决方案集是:[-1,0,1],-1,-1,2]] 下面是我的算法,它运行合理,符合预期,但我无法找出如何防止重复。我已经对我试图跟踪重复集(三元组)的部分进行了注释C++ Leetcode#15:3sum--避免重复,c++,arrays,c++11,C++,Arrays,C++11,供参考的问题陈述: 给定一个由n个整数组成的数组S,S中是否有元素a、b、c,使得a+b+c=0?查找数组中所有唯一的三元组,该数组的和为零 注意:解决方案集不得包含重复的三元组 例如,给定数组S=[-1,0,1,2,-1,-4] 解决方案集是:[-1,0,1],-1,-1,2]] 下面是我的算法,它运行合理,符合预期,但我无法找出如何防止重复。我已经对我试图跟踪重复集(三元组)的部分进行了注释 vector三和(vector&nums) { 向量res; int a、b、c、开始、结束; in
vector三和(vector&nums)
{
向量res;
int a、b、c、开始、结束;
int preva=0,prevb=0,prevc=0;//用于跟踪元素的变量
//三重态被推入结果
//上一次运行的矢量。
排序(nums.begin(),nums.end());
int n=nums.size();
对于(int i=0;i 0)
结束=结束-1;
其他的
开始=开始+1;
}
}
返回res;
}
我知道
你的回答:[-1,-1,2]]
哪个不匹配
预期答案:[-1,-1,2],-1,0,1]]
我没有将[-1,0,1]一起添加到向量中,而应该只将其添加到向量中一次。请考虑以下
if
语句中的条件表达式:
只有当a,b,c
中没有一个匹配preva,prevb,prevc
时,才会推送结果;在[-1,0,1]
的情况下,我们最终得到a=-1
匹配preva=-1
来自[-1,-1,2]
。此外,这只会检查前一个解决方案
相反,您应该确定一种与顺序无关的方法来存储这些结果,并让容器本身处理重复的结果,而不是
vector
?考虑以下if
语句中的条件表达式:
只有当a,b,c
中没有一个匹配preva,prevb,prevc
时,才会推送结果;在[-1,0,1]
的情况下,我们最终得到a=-1
匹配preva=-1
来自[-1,-1,2]
。此外,这只会检查前一个解决方案
相反,您应该确定一种与顺序无关的存储这些结果的方法,并让容器本身处理重复的结果,而不是使用
vector
?您可以使用std;:设置而不是std::vector
以避免重复。您可以使用std;:设置而不是std::vector
以避免重复。
vector<vector<int>> threeSum(vector<int>& nums)
{
vector< vector<int> > res;
int a,b,c,start,end;
int preva=0,prevb=0,prevc=0; //variables to track elements of
//triplet pushed into result
//vector the previous run.
sort(nums.begin(),nums.end());
int n=nums.size();
for(int i=0; i<=n-3;i++){
a = nums[i];
start = i+1;
end = n-1;
while (start < end){
b = nums[start];
c = nums[end];
if (a+b+c == 0)
{
if ((a!=preva)&&(b!=prevb)&&(c!=prevc)) //check if duplicate
res.push_back({a,b,c}); //add triplet
//to res vector if not
//present.
end = end - 1;
preva=a;
prevb=b;
prevc=c;
}
else if (a+b+c > 0)
end = end - 1;
else
start = start + 1;
}
}
return res;
}
if ((a!=preva)&&(b!=prevb)&&(c!=prevc)) //check if duplicate