题目:求1-n数子组合的n!有序排列中,第k个组合【leetcode 60】
题目描述
给出集合 [1,2,3,...,n],其所有元素共有 n! 种排列。
按大小顺序列出所有排列情况,给出第k个排列的组合
运行效率
大致思路
- 根据n-1位可以组合的数,来计算n位置的数字。
- i*dp[n-1]即,n位置如果是i,可以组合成多少排列。
- 如果i*dp[n-1]<k,说明n位置取值i,k = k % dp[select - 1]来计算出来用剩余的数字需要排列出来的第k个元素
- 如果i*dp[n-1]<k,说明找到结果了,就是n的最大排列
- 如此一次找下去,依次找到最后一位
代码如下
function getPermutation(n: number, k: number): string {
let dp = [1];
let res = [0];
for (let i = 1; i <= n; i++) {
dp[i] = dp[i - 1] * i;
res[i] = i;
}
let select = n;
while (select > 1) {
for (let i = 1; i <= select; i++) {
if (k <= dp[select - 1] * i) {
res[0] = res[i];
for (let j = i; j < select; j++) {
res[j] = res[j + 1];
}
res[select] = res[0];
if (k === dp[select - 1] * i) {
return getRes();
}
k = k % dp[select - 1];
break;
} else {
continue;
}
}
select--;
}
return getRes();
function getRes() {
res.shift();
return res.reverse().join("");
}
}
const res = getPermutation(4, 9);
debugger;