LeetCode 60. 排列序列
给出集合 [1,2,3,...,n]
,其所有元素共有 n!
种排列。
按大小顺序列出所有排列情况,并一一标记,当 n = 3
时, 所有排列如下:
"123"
"132"
"213"
"231"
"312"
"321"
给定 n
和 k
,返回第 k
个排列。
示例 1:
输入:n = 3, k = 3 输出:"213"
示例 2:
输入:n = 4, k = 9 输出:"2314"
示例 3:
输入:n = 3, k = 1 输出:"123"
提示:
1 <= n <= 9
1 <= k <= n!
class Solution {
public:string getPermutation(int n, int k) {if(n==1) return "1";if(n==2){if(k==1) return "12";else return "21";}int num[10];int s=1;int a[10];memset(num,0,sizeof(num));for(int i=1;i<=n;i++){s=s*i;}for(int i=1;i<=n-2;i++){int g=s/(n-i+1);int z=k/g;k=k%g;s=g;if(k!=0){z++;}else{k=g;}int x=0;for(int j=1;j<=n;j++){if(num[j]==0){x++;if(x==z){a[i-1]=j;num[j]=1;break;}}}}int q0=0,q1=0;for(int i=1;i<=n;i++){if(num[i]==0){if(q0==0) q0=i;else q1=i;}}if(k==1){a[n-2]=min(q0,q1);a[n-1]=max(q0,q1);}else{a[n-1]=min(q0,q1);a[n-2]=max(q0,q1);}string p;for(int i=0;i<n;i++){p=p+to_string(a[i]);}return p;}
};