3Sum - LeetCode

目录

题目链接

3Sum - LeetCode

注意点

  • 和two sum那道题不一样的是这题返回的是具体的数字,不是下标

解法

解法一:将每个数字都作为target,剩下的数字按照two sum那道题来做,得到的结果先排序然后放进set,保证没有重复的结果。因为用了太多STL容器所以...时间复杂度为O(我也不知道怎么算)

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        int i,n = nums.size(),target;
        set<vector<int>> ansSet;
        map<int,int> myMap;
        vector<int> anw;
        for(i = 0;i < n;i++)
        {
            target = -nums[i];
            int j;
            for(j = 0;j < n;j++)
            {
                if(j != i)
                {
                    if(myMap.count(target - nums[j]))
                    {
                        anw.push_back(nums[j]);
                        anw.push_back(target - nums[j]);
                        anw.push_back(-target);
                        sort(anw.begin(),anw.end());
                        ansSet.insert(anw);
                        anw.clear();
                    }
                    myMap[nums[j]] = j;
                }  
            }
            myMap.clear();
            anw.clear();
        }
        vector<vector<int>> ans;
        n = ansSet.size();
        set<vector<int>>::iterator it;   
        for(it=ansSet.begin();it!=ansSet.end();it++)
        {
            ans.push_back(*it);
        }
        return ans;
    }
};

解法二:因为这道题返回的是具体的数字,所以可以直接用sort()先对输入进行排序。然后和解法一一样每个数字都作为target,但是不一样的是,因为是有序的数组所以可以维护双指针加快速度,并且跳过重复的数字加快速度,同时因为跳过了重复的数字,就不需要对结果去重了。时间复杂度O(n^2)

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

小结

  • 慎用stl容器!不然你不知道你的程序时间复杂度和空间复杂度会变成什么鬼样子

猜你喜欢

转载自www.cnblogs.com/multhree/p/10329725.html