如何在数组中生成长度为M的所有排列

时间:2017-01-26 19:41:57

标签: arrays algorithm

假设我们有长度为N的数组,我需要在数组中生成长度为M的所有排列

我尝试使用下一个排列但是如果我想生成长度为5的数组长度为3的所有排列,我只得到前3个数字的排列。

这是我的代码:

mapper.setSerializationInclusion(Include.NON_DEFAULT)

提前致谢。

4 个答案:

答案 0 :(得分:1)

有更快的解决方案(参见Knuth 4A),但这个解决方案很简单并且在最佳线性因子范围内。您编写的内容中唯一的变化是(1)reverse语句(2)next_permutation的参数(n而不是m)。

#include <iostream>

#include <algorithm>

using namespace std;

int main() {
  int arr[5] = {1, 2, 3, 4, 5};
  int m = 3;

  do {
    for (int i = 0; i < m; i++) {
      cout << arr[i] << " ";
    }
    cout << endl;
    reverse(arr + m, arr + 5);
  } while (next_permutation(arr, arr + 5));
  return 0;
}

答案 1 :(得分:0)

这将给出所有顺序排列:

#include <iostream>

#include <algorithm>

using namespace std;

int main()
{
    int arr[5] = {1,2,3,4,5};
    int m=3;
    int ct = 0;

    do {
    do {
    for(int i=ct;i<ct+m;i++) {
        cout<<arr[i]<<" ";
    }
    cout<<endl;
    } while(next_permutation(arr+ct, arr+ct+m));
    ct++;
    } while (ct + m <= 5);
    return 0;
}

对于所有排列,请尝试使用位操作。

答案 2 :(得分:0)

对于这种稍微定制的探测器,最好的方法是回到旧学校递归并实现递归函数来提供输出。

以下是一个示例解决方案。

#include <iostream>
using namespace std;

int n=5;
int arr[5] = {1,2,3,4,5};
int vis[5]; //same size as arr[]
int m=3;
int ans[3];

void gen(int total_taken) {
    if(total_taken == m) {
        //found one permutation
        for(int i=0;i<m;i++) cout<<ans[i];
        cout<<endl;
        return;
    }    

    for(int i=0;i<n;i++) {
        if(vis[i]==0) {
            vis[i]=1;
            ans[total_taken] = arr[i];
            gen(total_taken+1);
            vis[i]=0;
        }    
    }
}

int main()
{
    //init n,m,ans[],arr[],vis[]
    gen(0);
    return 0;
}

答案 3 :(得分:0)

我认为Ayon Nahiyan的解决方案是最好的方法,因为这种定制问题。但是如果你只需要这个特定的情况(你需要拿3并得到它们的所有排列)并且还需要使用next_permutation我的代码是下班的(但是,如果你想改变这段代码会给你带来困难&#34; 3&#34;部分)

#include <iostream>

#include <algorithm>

using namespace std;

int main()
{
    int a[5] = {1,2,3,4,5};
    int arr[3];
    int m=3;

    for(int i=0;i<5;i++){
        for(int j=i+1;j<5;j++){
            for(int k=j+1;k<5;k++){
                arr[0]=a[i];
                arr[1]=a[j];
                arr[2]=a[k];
                do {
                    for(int i=0;i<m;i++) {
                        cout<<arr[i]<<" ";
                    }
                    cout<<endl;
                } while(next_permutation(arr, arr+m));
            }
        }
    }
    return 0;
}

<强>解释

上面的代码只是从您的数组中获取3的所有组合,并使用next_permutation

对其进行置换