15. 3Sum

来源:互联网 发布:谭铁牛 人工智能 编辑:程序博客网 时间:2024/06/10 23:52

1、题目描述

输入一个数组,返回所有不同的三个元素的组合,使得三个元素之和等于0,在每个组合里每个元素只可以使用一次。

2、思路

Two Pointers。

将按升序数组排序。取数组的一个元素(num[i])为三元组的第一个元素,从i+1到n-1的区间中用two pointers 的方法找到俩元素,

使得三者之和为0。若成功找到,要注意两个pointers要跳过数组中跟上次组三元组相同的元素,再次进行寻找。一次循环的复杂度为O(n);

要从头到尾n次上述操作。

总的复杂度为O(n^2)

3、代码

vector<vector<int>> threeSum(vector<int>& nums) {        vector<vector<int>>ans;        sort(nums.begin(),nums.end());        int n = nums.size();        for(int i=0;i<n;i++){            if(i==0||nums[i]>nums[i-1]){                for(int j=i+1,k=n-1;j<k;){                    if(nums[i]+nums[j]+nums[k]==0){                        vector<int>v;                        v.push_back(nums[i]);                        v.push_back(nums[j]);                        v.push_back(nums[k]);                        ans.push_back(v);                        while(nums[j]==nums[j+1] && j<k)j++;                        while(nums[k]==nums[k-1] && j<k)k--;                        j++;k--;                    }                    else if(nums[i]+nums[j]+nums[k]>0) k--;                    else j++;                }            }        }        return ans;    }