假设我们有长度为N的数组,我需要在数组中生成长度为M的所有排列
我尝试使用下一个排列但是如果我想生成长度为5的数组长度为3的所有排列,我只得到前3个数字的排列。
这是我的代码:
mapper.setSerializationInclusion(Include.NON_DEFAULT)
提前致谢。
答案 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