全排列问题(关于无重复元素的全排列)
问题叙述
给定一个不含重复数字的数组 list,返回其所有可能的全排列 。
你可以按任意顺序返回答案。
例如对1 2 3进行全排列,123 132 213 231 321 312
问题解析
从left到right进行排序(left和right指的是第几个数,这里用数组从0 开始到n-1结束)。
第一次使用Swap()控制首部不变和变,当为1是
#include<iostream>
#include<algorithm>
using namespace std;
//无重复元素进行全排列 (分治法)
//交换函数
void Swap(int &a,int &b){
int Temp = a;
a=b;
b=Temp;
}
//全排列 对数组list的k到m
void Perm(int list[],int left, int right)
{
if(left==right){ //当left==right时输出
for(int i=0;i<=m;i++){
cout<<list[i];
}
cout<<endl;
}
else{
for(int i=left;i<=right;i++){
//控制第一次输出的原始数据不变即123,然后控制首部变换
//分别以1,2,3开头
Swap(list[left],list[i]);
Perm(list,left+1,right);
//使用这个Swap函数()进行首部不变后边变换
Swap(list[left],list[i]);
}
}
}
int main(){
int n;
cin>>n;
int list[n];
for(int i=0 ; i<n ; i++){
cin>>list[i];
}
Perm(list,0,n-1);
}
拓展:也可以用到对字母排序
全排列问题(关于无重复元素的全排列)
#include<iostream>
#include<algorithm>
using namespace std;
//有重复元素进行全排列
//交换函数
void Swap(int &a,int &b){
int Temp = a;
a=b;
b=Temp;
}
//全排列 对数组list的k到m
void Perm(int list[],int k, int m)
{
if(k==m){
for(int i=0;i<=m;i++){
cout<<list[i];
}
cout<<endl;
}
else{
for(int i=k;i<=m;i++){
int flag=0;
for(int j=k;j<i;j++){
//判断k=i跟i++比较是否一样
//或者解释为数组为1222223,第2个与后边的是否一样一样直接continue;
if(list[j]==list[i]){
flag=1;
break;
}
}
if(1==flag)
continue;
Swap(list[k],list[i]);
Perm(list,k+1,m);
Swap(list[k],list[i]);
}
}
}
int main(){
int n;
cin>>n;
int list[n];
for(int i=0 ; i<n ; i++){
cin>>list[i];
}
Perm(list,0,n-1);
}