三个数之和(3sum)

来源:互联网 发布:网络攻防实验 编辑:程序博客网 时间:2024/04/27 15:11

https://leetcode.com/problems/3sum/description/

题目描述:给一个含n个整数的数组,找出不重复的所有的三个数相减为0的三元组

For example, given array S = [-1, 0, 1, 2, -1, -4],A solution set is:[  [-1, 0, 1],  [-1, -1, 2]]
vector<vector<int>> threeSum(vector<int>& nums) {    vector<vector<int>> result;    sort(nums.begin(),nums.end());   //对容器进行从小到大排序    for(int i=0;i<nums.size();i++)    {        //找taeget        if(nums[i]>0||nums[nums.size()-1]<0) break; //i后面的都是正,三个相加肯定就不会为0        if(i>0&&nums[i]==nums[i-1]) continue ;//防止重复        int target = 0-nums[i];        //转化为判断两个数的和是否等于常数target        int l=i+1,r=nums.size()-1;        //采用从两端向中间,        while(l<r){            //相等的情况,进栈,并对l,r去重            if(nums[l]+nums[r]==target){                result.push_back({nums[i],nums[l],nums[r]});                while(l<r&&nums[l]==nums[l+1]) l++;                while(l<r&&nums[r]==nums[r-1]) r--;                l++;                r--;            }else if(nums[l]+nums[r]<target) l++;            else r--;        }    }    return result;}