题目描述
给出集合 [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"
解题思路
参考之前的全排列问题,如果能够列出所有的排列,则可以方便的找出第k个排列。但是当n是8或9时,这种方法会报超时错误,所以需要剪枝操作。
已知N的阶乘等于N*(N-1)*(N-2)....1,那么对于N中的每一个数,比如取1时,应该有(N-1)*(N-2)....1种排列,所以如果知道k是取第几个数时的排列,就可以完成剪枝操作,而不用遍历所有的排列情况。
代码
def getPermutation(n,k):
factor = [0,1]
for i in range(2,n+1):
factor[i] = factor[-1]*i
ans = ''
nums = [str(i) for i in range(1,n+1)]
def dfs(nums,n,k,ans):
if n == 1:
ans += nums[0]
pos = 1
for pos in range(1,n):
# 找到k所在排列的位置
if k > (pos-1)*factor[n-1] and k <= pos*factor[n-1]:
break
ans += nums[pos-1]
return dfs(nums[0:pos-1]+nums[pos:],n-1,k-(pos-1)*factor[n-1],ans)
return dfs(nums,n,k,ans)