【leetcode】3Sum

来源:互联网 发布:docker网络模式 编辑:程序博客网 时间:2024/05/16 10:58

Question:

Given an array S of n integers, are there elements abc in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Note:

  • Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ? b ? c)
  • The solution set must not contain duplicate triplets.

    For example, given array S = {-1 0 1 2 -1 -4},    A solution set is:    (-1, 0, 1)    (-1, -1, 2)

Anwser 1: 

class Solution {public:    vector<vector<int> > threeSum(vector<int> &num) {        // Start typing your C/C++ solution below        // DO NOT write int main() function                vector< vector<int> > ret;                int len = num.size();        if(len < 3) return ret;                vector<int> num2;        num2.assign(num.begin(), num.end());                sort( num2.begin(), num2.end() );       // sort  O(n*log(n))                        vector<int> tmpRet(3);        tmpRet[0] = num2[0] - 1;                for(int i = 0; i < len - 2; i++){       // O(n*m)            int l = i + 1;            int r = len - 1;                        if(num2[i] == tmpRet[0]) continue;            tmpRet[0] = num2[i];                        while(l < r) {                int sum2 = num2[l] + num2[r];                if(num2[i] + sum2 == 0){                    tmpRet[1] = num2[l];                    tmpRet[2] = num2[r];                                        ret.push_back(tmpRet);                                        while(num2[++l] == num2[l-1] && l < r);   // remove same number                    while(num2[--r] == num2[r+1] && l < r);                              } else if(num2[i] + sum2 < 0){                    l++;                } else {                    r--;                }            }        }                return ret;    }};