题目:
给出集合 [1,2,3,...,n],其所有元素共有 n! 种排列。
按大小顺序列出所有排列情况,返回第 k 个排列。
示例 1:
输入:n = 3, k = 3
输出:"213"
解答:javascript
javascript
let result = ''
let count = 0
var getPermutation = function(n, k) {
// 这里需要重置下值,不然多个用例运行会出错
result = ''
count = 0
const line = []
const arr = new Array(n).fill(null).map((v, i) => i + 1)
dp(arr, line, k)
return result
};
const dp = (arr, line, k) => {
if (result) {
return
}
if (arr.length === 0) {
count++
if (count === k) {
result = line.join("")
}
return
}
for (let i = 0;i < arr.length;i++) {
let len = arr.length - 1;
// 用阶乘计算有几种情况,如果这些情况总数未达到 k,
// 那么情况数相加, 不走后面排序节约内存
if (len > 1) {
let cnt = 1
while(len > 1) {
cnt *= len
len--
}
if (cnt + count < k) {
count += cnt
continue
}
}
line.push(arr[i])
const newArr = arr.filter((v, j) => i !== j)
dp(newArr, line, k)
// 回溯
line.pop()
}
}