题解 | #数组中相加和为0的三元组#

数组中相加和为0的三元组

http://www.nowcoder.com/practice/345e2ed5f81d4017bbb8cc6055b0b711

先判断数组数量是否大于3

然后给数组排序,判断前三个数的和是否大于0,如果大于,则return

设置i为三元组的第一个数,l为第二个,r为第三个

从0开始遍历i,l=i+1,r=num.size()-1

然后判断三个数的和--x,当大于0,将r--,小于0,将l++,等于0,l++, r--

删除重复的三元组:----->>当x==0时,如果num[l+1] == num[l],将l++,如果num[r-1]==num[r],将r--;同时,每次遍历开始时如果num[i]==num[i-1],就跳过当前遍历,进入下一轮遍历

 vector<vector<int> > threeSum(vector<int> &num) {
        vector<vector<int> > res;
        if(num.size() < 3)
            return res;
        sort(num.begin(), num.end());
        if(num[0] + num[1] + num[2] > 0)
            return res;
        for(int i = 0; i < num.size() - 2; i++) {
            if(num[i] > 0)
                break;
            if(i && num[i] == num[i-1])
                continue;
            for(int l = i + 1, r = num.size() - 1; l < r;) {
                vector<int> ans;
                int x = num[i] + num[l] + num[r];
                if(x < 0)
                    l++;
                else if(x > 0)
                    r--;
                else {
                    ans.push_back(num[i]);
                    ans.push_back(num[l]);
                    ans.push_back(num[r]);
                    res.push_back(ans);
                    while(num[l] == num[l+1] && l + 1 < r) l++;
                    while(num[r] == num[r-1] && r - 1 > l) r--;
                    l++;
                    r--;
                }
            }
        }
        return res;
    }
全部评论

相关推荐

阿武同学:不要写至今,写具体哪年哪月毕业,专业技能往后排,项目往前排,共青团员可以不写
投了多少份简历才上岸
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务