如何删除特定数据集中的重复项?

假设我们有两个孩子想要相同的数字或硬币(硬币名义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 12 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 &currentPermutation : 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

回到顶部