leetcode 60. 第k个排列(Permutation Sequence)
题目描述:
给出集合 [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"
解法:
class Solution {
public:
string getPermutation(int n, int k) {
// startswith 1 contains (n-1)! cases
// 213 ==> first, k = k - 1, then idx = k/(2!), k = k %(2!)
string res = "";
string digits = "";
int multi = 1;
for(int i = 1; i <= n; i++){
digits += char('0' + i);
multi *= i;
}
// multi initialized value n!
k--;
while(!digits.empty()){
multi /= n;
n--;
int idx = k/multi;
res += digits[idx];
digits.erase(digits.begin() + idx);
k %= multi;
}
return res;
}
};