C++——数组中相加和为0的三元组

  • Post author:
  • Post category:其他


在这里插入图片描述

首先遍历数组,在遍历的过程中,当遍历的当前元素时,用双指针分别从当前元素的下一个元素和数组末尾元素开始扫描,计算三者和,若是满足和为0,则将双指针指向的元素push,然后双指针都继续扫描是否还存在不同的解,这时要注意判断扫描的元素是否和上一个元素相同,若相同,则忽略该元素,继续扫描(为的是防止有重复解)。若是不满足为0,则将和与0比较大小,若是比0 小,则移动左指针,若是比0大,则移动右指针,然后重复上述流程,直到遍历完所有数组值,就得到最后的解。

如果题目换成指定的相加和的值target,则方法不变,将0换为target即可。

代码如下:

class Solution {
public:
    vector<vector<int> > threeSum(vector<int> &num) {
        vector<vector<int>>res;
        if(num.size()<3) return res;
        
        sort(num.begin(),num.end());
        for(int i=0;i<num.size()-2;i++)
        {
            if(num[i]>0) return res;
            if(i>0&&num[i-1]==num[i]) continue;
            int lf=i+1;
            int rg=num.size()-1;
            while(lf<rg)
            {
                int sum=num[i]+num[lf]+num[rg];
                vector<int>vec;
                if(sum==0)
                {  
                    
                    vec.push_back(num[i]);
                    vec.push_back(num[lf]);
                    vec.push_back(num[rg]);
                    res.push_back(vec);
                    while(lf<rg&&num[lf]==num[lf+1])
                        lf++;
                    while(lf<rg&&num[rg]==num[rg-1])
                        rg--;
                    rg--;
                    lf++;
                }
                else if(sum>0) rg--;
                else if(sum<0) lf++;
            }
        }
        return res;
    }
};



版权声明:本文为ldm_666原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。