LeetCode 15:使用哈希映射的 3Sum

LeetCode 15: 3Sum using hash maps

我用 cpp 编写了代码,但它没有给出正确的输出。

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> v;
        if(nums.size()==0)
        {
            return v;
        }
        for(int i=0;i<nums.size()-1;i++)
        {
            set<int> s;
            for(int j=i+1;j<nums.size();j++)
            {
                int currsum = 0-nums[i]-nums[j];
                if(s.find(currsum)!=s.end())
                {
                    v.push_back(vector<int> ({nums[i], nums[j],currsum}));
                    break;
                }
                else
                    s.insert(nums[j]);
            }
        }
        return v;
    }
};

这与leetcode中的测试用例不同

请帮忙!

我想这将是一个 O(N ^ 2) 的有效解决方案,它通过了 LeetCode 的 "Online Judge":

class Solution {
public:
    vector<vector<int>> threeSum(vector<int> &nums) {
        vector<vector<int>> triplets;

        std::sort(nums.begin(), nums.end());

        for (int index = 0; index < nums.size(); index++) {
            int target = -nums[index];
            int lo = -~index, hi = nums.size() - 1;

            if (target < 0)
                break;

            while (lo < hi) {
                int sum = nums[lo] + nums[hi];

                if (sum < target)
                    lo++;

                else if (sum > target)
                    hi--;

                else {
                    vector<int> triplet(3, 0);
                    triplet[0] = nums[index];
                    triplet[1] = num[lo];
                    triplet[2] = num[hi];
                    triplets.push_back(triplet);

                    while (lo < hi && nums[lo] == triplet[1])
                        lo++;

                    while (lo < hi && nums[lo] == triplet[2])
                        hi--;
                }
            }

            while (-~index < nums.size() && nums[-~index] == nums[index])
                index++;
        }

        return triplets;
    }
};

这里是 LeetCode 的解决方案之一(也是 O(N ^ 2)):

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> res;
        set<pair<int, int>> found; // or define hash<pair<int, int>> and use unordered_set.
        unordered_set<int> dups;
        unordered_map<int, int> seen;

        for (int i = 0; i < nums.size(); ++i)
            if (dups.insert(nums[i]).second)
                for (int j = i + 1; j < nums.size(); ++j) {
                    int complement = -nums[i] - nums[j];
                    auto it = seen.find(complement);

                    if (it != end(seen) && it->second == i) {
                        int v1 = min(nums[i], min(complement, nums[j]));
                        int v2 = max(nums[i], max(complement, nums[j]));

                        if (found.insert({v1, v2}).second)
                            res.push_back({nums[i], complement, nums[j]});
                    }

                    seen[nums[j]] = i;
                }

        return res;
    }
};

参考