使用哈希在3sum问题中获取重复项

时间:2019-05-09 06:34:44

标签: c++ algorithm unordered-set

我正在做三和问题3SUM 我知道更好的解决方案是使用两个指针。 但是我尝试使用散列来解决这个问题,但是我 获取重复的三胞胎。 尽管我尝试删除重复项,但仍然可以得到它们。

// C++ program to find a triplet using Hashing 
#include <iostream>
#include<unordered_set>
#include<vector>
#include<algorithm>
using namespace std;
class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> output;
        unordered_set<int> seen;
        sort(nums.begin(), nums.end());
        for (int i = 0; i < nums.size(); ++i) {
            //removing duplicates
            if (i != 0 && nums[i] == nums[i - 1]) continue;

            for (int j = i + 1; j < nums.size(); ++j) {
                if (seen.count(-nums[i] - nums[j])) {
                    output.push_back({ nums[i], nums[j], -nums[i] - nums[j] });
                    // Skip duplicates
                    while (j + 1 < nums.size() && nums[j + 1] == nums[j]) ++j;
                }
                seen.insert(nums[j]);
            }
        }
        return output;
    }
};



/* Driver program to test above function */
int main()
{
    vector<int> A = { -1,0,1,2,-1,-4 };
    int sum = 13;
    int arr_size = sizeof(A) / sizeof(A[0]);
    vector<vector<int>> v;

    Solution s;
    v=s.threeSum(A);
    //printing duplicates here
    for (auto p : v) {
        for (auto m : p) {
            cout << m<<" ";
        }
        cout << endl;
    }

    return 0;
}

0 个答案:

没有答案