题目
题目描述
给出集合 [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 ! n! n!
题解
要找到给定集合 [1,2,3,...,n]
的第 k
个排列,可以使用两种主要方法:暴力法(生成所有排列然后选择第 k
个)和优化的数学方法。由于 n 的范围是 1 到 9,暴力法虽然可行但效率不高,因此推荐使用数学方法来高效解决问题。
数学方法
该方法的核心思想是利用阶乘数系统(Factorial Number System),通过逐步确定每一位数字,从而直接构造出第 k
个排列,而不需要生成所有的排列组合。
步骤说明
-
初始化:
- 计算
(n-1)!
,因为每个位置的选择会影响剩余位置的排列数量。 - 准备一个包含
[1, 2, ..., n]
的列表,用于从中选择数字。
- 计算
-
确定每一位数字:
- 对于每一位,计算当前位应该取哪个数字。具体来说,
k
可以被
- 对于每一位,计算当前位应该取哪个数字。具体来说,