我有一个n个元素的数组,我需要将它们的所有2个组合放入长度为2的数组中。例如:
假设梳子是二维阵列。
n = 1,2,3
我需要将所有2-组合放到comb [i] [j]中:
comb[0][0] = {1}
comb[0][1] = {2}
comb[1][0] = {1}
comb[1][1] = {3}
comb[2][0] = {2}
comb[2][1] = {3}
我不知道如何编写代码! 感谢
我的回答:
O(n!)答案:n =总数m =总可能答案
int m = 0;
for (int i = 0; i < n - 1; i++){
int first = a[i];
for(int j = i+1 ; j < n ; j++){
int second = a[j];
comb[m][0] = first;
comb[m][1] = second;
++m;
}
}
答案 0 :(得分:1)
可以想到以下N ^ 2方法:
// Resulting combinations
vector<pair<int,int> > comb;
// Copy n into a double-ended queue - best would be for n to already be a deque
deque<int> Q(a.size());
copy(a.begin(), a.end(), Q.begin());
sort(Q.begin(), Q.end());
while(!Q.empty())
{
// Get first element, remove it and equivalent elements
int a = Q.front();
while(Q.front() == a)
Q.pop_front();
// Find all unique combinations with first element
int last=a;
for(deque<int>::iterator it = Q.begin(); it != Q.end(); ++it)
{
if(*it != last)
comb.push_back(pair<int,int>(a,*it));
last = *it;
}
}
可能很容易进一步优化。
答案 1 :(得分:0)
对于n
索引的第i个元素,将n
中的每个元素放在单元格comb[length(n) - i][j]
中除第i个索引的第j个之外。
答案 2 :(得分:0)
一种简单的方法是使用STL库中的next_permutation
函数来生成数字的所有可能排列,然后选择每个元素的前两个元素。请注意,必须首先对序列进行排序,就好不会跳过先前的排列。
int nums[] = {1, 2, 3, 4};
while (next_permutation(nums, nums + 4)) {
cout << nums[0] << ", " << nums[1] << endl;
}
请记住,您必须#include <algorithm>
才能使用此功能。