The set[1,2,3,…,n]contains a total of n! unique permutations.
By listing and labeling all of the permutations in order,
We get the following sequence (ie, for n = 3):
- "123"
- "132"
- "213"
- "231"
- "312"
- "321"
Given n and k, return the k th permutation sequence.
Note: Given n will be between 1 and 9 inclusive.
看了网上好几个大神的讲解,自己琢磨了一会儿,终于明白是怎么回事了。
假设集合为[1,2,3,...n],求出第k个序列。
第k个序列为:a1,a2,a3,...an,对应的下标为k-1(下表从0开始);
那么怎么确定a1的值呢?
把a1去掉之后,剩下的序列为a2,a3....an.一共n-1个元素,有(n-1)!个排列。这里:
设变量k1=k-1,a1=k1/(n-1)!//a1为当前序列第一位的选择下标
当确定a1对应的值之后,需将当前序列中的值去掉a1对应值,即当前序列更新为n-1个元素!!!
同理,a2对应的值可以推导为:
把a2去掉之后,剩下的序列为a3,a4,....an.一共n-2个元素,有(n-2)!个排列。
k2=k1%(n-1)!,a2=k2/(n-2)!
。。。。
k(n-1)=k(n-2)%2!,a(n-1)=k(n-1)/1!
an=k(n-1);
以序列[1,2,3] ,k=3为例
k1=3-1=2,a1=k1/(n-1)!=2/2!=1,下标为1对应的集合元素为2,当前序列变为[1,3]。
k2=k1%(n-1)!=2%2!=0,a2=k2/(n-2)!=0,下标为0对应的集合元素为1,当前序列变为[3]。
K3=k2%(n-2)!=0%1!=0,a2=k2/(n-2)!=0,下标为0对应的集合元素为3,当前序列变为[3]。
所以,第3个序列为213。
string getPermutation(int n, int k)
{
vector<int> num(n);
int pcount=1;
for(int i=0;i<n;i++)
{
num[i]=i+1;
pcount=pcount*num[i];//保存元素的乘积
}
k--;//序列下标从0开始
string res="";//声明字符串并置空
for(int i=0;i<n;i++)
{
pcount=pcount/(n-i);//得到阶乘的值
int index=k/pcount;//得到第i个元素的下标
res+=(num[index]+'0');//将整型数组元素变为字符串元素
for(int j=index;j<n-i-1;j++)
num[j]=num[j+1];//更新原序列
k=k%pcount;
}
return res;
}