Leetcode--3Sum

来源:互联网 发布:js 获取对象属性 编辑:程序博客网 时间:2024/05/18 18:19

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)


Solution 1:

固定一个数,然后求解两个数的和等于target(0)

值得一提的是,set容器解决重复数问题很方便

class Solution {public:#define MAX(a,b,c)  (a>b?a:b)>c?(a>b?a:b):c#define MIN(a,b,c)  (a<b?a:b)<c?(a<b?a:b):c   vector<vector<int> > threeSum(vector<int> &num) {        multimap<int,int> m;set<vector<int>> mres;        for(int i=0;i<num.size();i++)            m.insert(pair<int,int>(num[i],i+1));                    multimap<int,int>::iterator it1;        multimap<int,int>::iterator it2;        multimap<int,int>::iterator it3;        for(it1=m.begin();it1!=m.end();it1++)        {   //it2=it1,it2++;            for(it2=it1,it2++;it2!=m.end();it2++)                {                    if((it3=m.find(0-it1->first-it2->first))!=m.end()&&it3!=it2&&it3!=it1)                    {                        vector<int>temp;                        int mi=MIN(it1->first,it2->first,it3->first);                        int ma=MAX(it1->first,it2->first,it3->first);                        temp.push_back(mi);                        temp.push_back(0-mi-ma);                        temp.push_back(ma);mres.insert(temp);                    }                }        }/*set<vector<int>>::iterator sit=mres.begin();while(sit!=mres.begin()){res.push_back(*sit);sit++;}*/vector<vector<int>>res(mres.begin(),mres.end());        return res;            }};

时间复杂度为O(n^2logn)

结果

Submission Result: Time Limit Exceeded

还需优化

class Solution {public:        vector<vector<int> > threeSum(vector<int> &num)    {        vector<vector<int>> res;        if(num.size()<3)            return res;        sort(num.begin(),num.end());        for(int i=0;i<num.size();i++)        {            if(i>0&&num[i]==num[i-1])                continue;                            int a=num[i];            int l=i+1;            int r=num.size()-1;                                    while(l<r)            {                if(l>i+1&&num[l]==num[l-1]){                    l++;                    continue;                }                if(r<num.size()-1&&num[r]==num[r+1])                {                    r--;                    continue;                }                                if(num[l]+num[r]+a<0)                    l++;                else if(num[l]+num[r]+a>0)                    r--;                else                {                    vector<int>tmp;                    tmp.push_back(num[i]);                    tmp.push_back(num[l]);                    tmp.push_back(num[r]);                    res.push_back(tmp);                    l++;                            }            }        }                                return res;    }};



0 0
原创粉丝点击