題目鏈接
難度: 中等 ??????類(lèi)型:數(shù)學(xué)
給出集合 [1,2,3,…,n],其所有元素共有 n! 種排列。
按大小順序列出所有排列情況,并一一標(biāo)記,當(dāng) n = 3 時(shí), 所有排列如下:
"123"
"132"
"213"
"231"
"312"
"321"
給定 n 和 k,返回第 k 個(gè)排列。
示例1
輸入: n = 3, k = 3
輸出: "213"
示例2
輸入: n = 4, k = 9
輸出: "2314"
解題思路
對(duì)于n個(gè)數(shù)的排列,以‘1’開(kāi)頭的排列有(n-1)!個(gè),以‘2’開(kāi)頭的排列有(n-1)!個(gè),等等,通過(guò)這種方式可以計(jì)算出第k個(gè)排列是由哪個(gè)數(shù)字開(kāi)頭的
例如:
n=3, k=3
以‘1’開(kāi)頭的排列有2 (由(3-1)!計(jì)算可知)個(gè),第3個(gè),是由‘2’開(kāi)頭,現(xiàn)在數(shù)字只剩下‘1’,‘3’
問(wèn)題轉(zhuǎn)化為‘1’,‘3’兩個(gè)數(shù)構(gòu)成的排列中,第1(由3-2得)個(gè)排列的第1個(gè)數(shù)字是多少,依次類(lèi)推,確定所有數(shù)字
代碼實(shí)現(xiàn)
import math
class Solution:
def getPermutation(self, n: int, k: int) -> str:
kth = ''
nums = list(map(str, range(1, n+1)))
k -= 1
while n>0:
n -= 1
f = math.factorial(n)
index, k = divmod(k, f)
kth += nums.pop(index)
return kth