题目
leetcode 60
给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。
按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:
“123”
“132”
“213”
“231”
“312”
“321”
给定 n 和 k,返回第 k 个排列。
说明:
给定 n 的范围是 [1, 9]。
给定 k 的范围是[1, n!]。
示例 1:
输入: n = 3, k = 3
输出: “213”
示例 2:
输入: n = 4, k = 9
输出: “2314”
void dfs(char *res, int ind, int n, int num, int k, int flag[]) {
if (num > k) {
for (int j = 1; j <= n; j++) {
if (flag[j] == 0) {
res[ind] = j + '0';
flag[j] = 1;
break;
}
}
dfs(res, ind + 1, n, num / (n - ind - 1), k, flag);
} else {
int x;
if (k % num == 0) {
x = k / num;
for (int j = 1; j <= n; j++) {
if (flag[j]) continue;
x--;
if (x == 0) {x = j; break;}
}
flag[x] = 1;
res[ind++] = x + '0';
for (int j = n; j >= 1; j--) {
if (flag[j]) continue;
res[ind++] = j + '0';
}
return ;
}
x = k / num + 1;
k = k % num;
for (int j = 1; j <= n; j++) {
if (flag[j]) continue;
x--;
if (x == 0) {x = j; break;}
}
flag[x] = 1;
res[ind] = x + '0';
dfs(res, ind + 1, n, num / (n - ind - 1), k, flag);
}
}
char * getPermutation(int n, int k){
int flag[n + 1], num = 1;
for (int i = 1; i <= n; i++) {
flag[i] = 0;
num *= i;
}
char *res = (char *)malloc(sizeof(char) * (n + 1));
dfs(res, 0, n, num / n, k, flag);
res[n] = '\0';
return res;
}