https://leetcode.com/problems/permutation-sequence/
这类题目,有必要学习一下,排列,问第K个。
个人解答
class Solution:
def getPermutation(self, n: int, k: int) -> str:
l = [i for i in range(1, n + 1)]
res = ''
fac = factorial(n)
k -= 1
while k > 0:
q, k = divmod(k, fac // n)
res += str(l[q])
del(l[q])
fac //= n
n -= 1
res += ''.join(map(str, l))
return res
题目分析
显然是有规律可言的。
"123"
"132"
"213"
"231"
"312"
"321"
从最高位到最低位,选择越来越少(分别是3,2,1)
定了最高位之后,后边有 (n-1)!
个
具体来看,如果想知道当前对应的是第几个,那么除以(n-1)!
即可,而剩下的,可以用来索引下一位。
代码中的 fac // n
其实就是 (n - 1)!
,只不过这样计算更为高效。