描述
该题来自于力扣第60题
分析
最简单的思路,就是按照力扣第31题的思路,每次求下一个排列,直到第
但是有更高效的方法,我们知道如果首位是1,那么一共有(n-1)!种情况,所以如果首项是2,那么至少是1 * (n-1)!项之后了,一般地,如果首项是i,那么至少是(i-1) * (n-1)!项之后了。所以如果给定了k,则(k-1) / (n-1)! + 1就表示首项的数字,确定了首项,再使用类似的方法确定第二项,只不过这时数字应该去掉首项的数字后内选择,以此类推。整个公式可以写成:
依次求出index,即可得到答案。
- 这里给出一个例子说明一些细节;比如
n=4, k=9时,如何求解;首先需要计算到,即 ;剩下数字为 1 2 3 4; - 然后计算
,所以首项是 2,剩下的数字为1 3 4; - 首项
2确定后,即前面已经有项了,那么就只要考虑 1 3 4组成的排列的第k-6=3项了,同样的方法计算,从而第二项是数字 3; - 前两项为
23后,剩下的数字为1 4,前面已经确定项, 剩下 1项,然后计算a_2= (1 - 1) / 1! = 0,即第三项数字为1; - 最后一项只能是
4; - 所以排列是
2 3 1 4
代码
python
class Solution:
def getPermutation(self, n: int, k: int) -> str:
fractal = [1]*n
for i in range(1, n):
fractal[i] = fractal[i-1] * i
nlist = list(range(1, n+1))
ans = ""
for i in range(n):
ind = (k-1) // fractal[n-i-1]
k %= fractal[n-i-1]
ans += str(nlist[ind])
nlist.pop(ind)
return ans
继续这个系列