2-组合c ++

时间:2012-05-05 20:27:30

标签: c++ combinations

我有一个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;
}

}

3 个答案:

答案 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>才能使用此功能。