-
方法一:回溯搜索算法 + 剪枝 ,直接来到叶子结点
class Solution:
def getPermutation(self, n: int, k: int) -> str:
def dfs(n, k, index, path):
if index == n:
return
# 查看x位数对应的阶乘数量是多少
cnt = factorial[n - 1 - index]
for i in range(1, n + 1):
if used[i]:
continue
if cnt < k:
k -= cnt
continue
path.append(i)
used[i] = True
dfs(n, k, index + 1, path)
# 注意:这里要加 return,后面的数没有必要遍历去尝试了
return
if n == 0:
return ""
used = [False for _ in range(n + 1)]
path = []
# 记录n位数阶乘的数量
factorial = [1 for _ in range(n + 1)]
for i in range(2, n + 1):
factorial[i] = factorial[i - 1] * i
dfs(n, k, 0, path)
return ''.join([str(num) for num in path])
- 方法二:数学方法
class Solution:
def getPermutation(self, n: int, k: int) -> str:
factorial = [1]
for i in range(1, n):
factorial.append(factorial[-1] * i)
k -= 1
ans = []
valid = [1] * (n + 1) # 记录每一个数是否被用过
for i in range(1, n + 1):
order = k // factorial[n - i] + 1
for j in range(1, n + 1):
order -= valid[j]
if order == 0:
ans.append(str(j))
valid[j] = 0
break
k %= factorial[n - i]
return "".join(ans)