如何删除特定数据集中的重复项?
假设我们有两个孩子想要相同的数字或硬币(硬币名义1,2,6,12)。孩子们不在乎价值。 我想要两个孩子的之间共享排列的例子容器:如何删除特定数据集中的重复项?
{1, 1, 1, 1, 1, 1}, {1, 1, 2, 2},
{1, 2, 1, 2},
{1, 2, 2, 1},
{2, 1, 1, 2},
{2, 1, 2, 1},
{2, 2, 1, 1}
现在我想要一份有集合没有重复:
child A child B 2 2 1 1
2 1 2 1
1 1 2 2
1 1 1 1 1 1
排列是错误的:
1 2 1 2 1 2 2 1
2 1 1 2
因为
child A child B 1 2 1 2
是
child A child B 2 1 2 1
排列,我们已经有了。这些集合:1 2 2 1
和2 1 1 2
也是排列组合。
我的解决方案是在这里,为特定的输入正确工作,但如果你添加更多的硬币与不同的名义,它不!
#include <iostream> #include <vector>
#include <unordered_set>
using namespace std;
int main()
{
vector<vector<int>> permutations =
{
{1, 1, 1, 1, 1, 1},
{1, 1, 2, 2},
{1, 2, 1, 2},
{1, 2, 2, 1},
{2, 1, 1, 2},
{2, 1, 2, 1},
{2, 2, 1, 1}
};
vector<pair<unordered_multiset<int>, unordered_multiset<int>>> childSubsets;
for(const auto ¤tPermutation : permutations)
{
size_t currentPermutationSize = currentPermutation.size();
size_t currentPermutationHalfSize = currentPermutationSize/2;
//left
unordered_multiset<int> leftSet;
for(int i=0;i<currentPermutationHalfSize;++i)
leftSet.insert(currentPermutation[i]);
bool leftSubsetExist = false;
for(const auto &subset : childSubsets)
{
if(subset.first == leftSet)
{
leftSubsetExist = true;
break;
}
}
//right
unordered_multiset<int> rightSet;
for(int i = currentPermutationHalfSize; i < currentPermutationSize; ++i)
rightSet.insert(currentPermutation[i]);
bool rightSubsetExist = false;
for(const auto &subset : childSubsets)
{
if(subset.second == rightSet)
{
rightSubsetExist = true;
break;
}
}
//summarize
if(!leftSubsetExist || !rightSubsetExist) childSubsets.push_back({leftSet, rightSet});
}
cout << childSubsets.size() << endl;
}
如何更改解决方案以实现最优化和更简单?
回答:
你应该第一个周期(如优化)之后添加
if (leftSubsetExist) continue;
你可以添加一些 “错误” 排列(与另一硬币)?
以上是 如何删除特定数据集中的重复项? 的全部内容, 来源链接: utcz.com/qa/258623.html