LeetCode 15. 3Sum

题目大意就是给你一个数组,从里面找出三个数字,使这三个数字的和为0。
通过先排序,枚举第一个数字a,然后可以通过前后夹逼的方法,找到两个数字b,c。使b + c = -a。那么这三个即符合题意,需要注意的是,去除重复元素。自己写的用set,感觉有点蠢。。。, 时间复杂度有点高,300多ms过的。

class Solution
{
public:
    vector<vector<int> > threeSum(vector<int>& nums)
    {
        set<vector<int> > st;
        sort(nums.begin(), nums.end());
        for(int i=0; i<nums.size(); ++ i)
        {
            int t = -nums[i];
            int b = i + 1, e = nums.size() - 1;
            while(b < e)
            {
                int sum = nums[b] + nums[e];
                if(sum < t)
                    b ++;
                else if(sum > t)
                    e --;
                else
                {
                    st.insert(vector<int> {nums[i], nums[b], nums[e]});
                    b ++, e --;
                }
            }
        }
        vector<vector<int> > vec;
        for(auto it = st.begin(); it != st.end(); ++ it)
            vec.push_back(*it);
        return vec;
    }
};

后来观看别人代码,100多ms


class Solution
{
public:
    vector<vector<int> > threeSum(vector<int>& nums)
    {
        sort(nums.begin(), nums.end());
        vector<vector<int> >vec;
        for(int i=0; i<nums.size(); ++ i)
        {
            int t = -nums[i];
            int b = i + 1, e = nums.size() - 1;
            while(b < e)
            {
                int sum = nums[b] + nums[e];
                if(sum < t)
                    b ++;
                else if(sum > t)
                    e --;
                else
                {
                    int y = nums[b], z = nums[e];
                    vec.push_back(vector<int> {nums[i], nums[b], nums[e]});
                    b ++, e --;
                    while(b < e && nums[b] == y)
                        b ++;
                    while(b < e && nums[e] == z)
                        e --;
                }
            }
            while(i+1 < nums.size() && nums[i] == nums[i+1])
                i ++;
        }
        return vec;
    }
};

posted @ 2017-03-08 21:22  aiterator  阅读(80)  评论(0编辑  收藏  举报