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

getting duplicates in 3sum problem using hashing

本文关键字:问题 3sum 哈希      更新时间:2023-10-16

我正在做三个总问题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;
}

您正在使用 unordered_set See 用于所有 i i 引起重复的三胞胎。更改的范围解决问题。请在下面找到正确的代码。

vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> output;
        sort(nums.begin(), nums.end());
        for (int i = 0; i < nums.size(); ++i) {
            //removing duplicates
            if (i != 0 && nums[i] == nums[i - 1]) continue;
            unordered_set<int> seen; //changed the scope of seen
            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;
    }

解决此问题的优化方法将使用两个分量,而无需使用任何额外的空间。

vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        int n = nums.size();
        vector<vector<int>> ret;
        for(int i=0;i<n;i++)
        {
            if(i > 0 && nums[i] == nums[i-1]) continue;
            int j = i+1;
            int k = n-1;
            while(j < k)
            {
                if(nums[i] + nums[j] + nums[k] == 0)
                {
                    ret.push_back({nums[i], nums[j], nums[k]});
                    while(j < k && nums[j] == nums[++j]);
                    while(j < k && nums[k] == nums[--k]);
                }
                else if(nums[i] + nums[j] + nums[k] < 0)
                    j++;
                else
                    k--;
            }
        }
        return ret;
    }