15. 三数之和

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组

-----------------------------------------------------------------

1.首先要进行排序,方便后续遍历有一个明确的先后顺序,不会出现 (b, a, c)(c, b, a)(c,b,a) 这些重复的情况,随后使用普通的三重循环就可以满足上面的要求。

2.对于每一重循环而言,相邻两次枚举的元素不能相同,否则也会造成重复。举个例子,如果排完序的数组为[-1,0,1,1],避免[-1,0,1]这个解出现两次

class Solution {
public:
//返回值是一个二维数组
    vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(),nums.end());//排序
        vector<vector<int>>v1;//创建一个二维数组容器,用来存放最后的返回值
        int n=nums.size();
        for(int first=0;first<n;++first)//++first与first++的效果相同,但速度更快
        {
            if(first>0&&nums[first]==nums[first-1])//当first=0的时候不执行这个的代码,只是用来判断不等于0时取得值是否和上次取值相同,相同则first+1,继续循环
            {
                continue;
            }
            int third=n-1;//第三个数的指针
            int num=-nums[first];
            for(int second=first+1;second<n;++second)
            {
                if(second>first+1&&nums[second]==nums[second-1])
                {
                    continue;
                }
                while(second<third&&nums[second]+nums[third]>num)//此处之所以是>,而不是<,是因为排序后越往后越大,两者的和肯定大于nums[first],并且只有在不再>的时候有机会出现=0
                {
                    --third;
                }
                if(second==third)
                {
                    break;
                }
                if(nums[first]+nums[second]+nums[third]==0)
                {
                    v1.push_back({nums[first],nums[second],nums[third]});//将得到的结果插入到容器
                }


            }

        }
        return v1;//得到结果

    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值