使用哈希在3sum问题中重复
getting duplicates in 3sum problem using hashing
我正在做三个总问题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;
}
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- C++格式化输出问题
- 使用哈希在3sum问题中重复