C++ Leetcode#15:3sum--避免重复

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

供参考的问题陈述:

给定一个由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、开始、结束;
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