FYI问题陈述:
给定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<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;
}
我明白了,
你的回答:[[-1,-1,2]]
与
不匹配预期答案:[[-1,-1,2],[ - 1,0,1]]
我完全没有添加[-1,0,1],而应该只将它添加到矢量一次。
答案 0 :(得分:3)
考虑以下if
语句中的条件表达式:
if ((a!=preva)&&(b!=prevb)&&(c!=prevc)) //check if duplicate
如果a,b,c
都不匹配preva,prevb,prevc
,则仅推送结果;在[-1,0,1]
案例中,我们最终与a = -1
preva = -1
匹配[-1,-1,2]
。此外,这只会检查上一个解决方案。
相反,您应该确定一种与订单无关的存储这些结果的方法,并让容器本身处理重复项 - 可能是std::set
而不是vector
?