Description
The set [1,2,3,…,n] contains a total of n! unique permutations.
By listing and labeling all of the permutations in order, we get the following sequence for n = 3:
“123”
“132”
“213”
“231”
“312”
“321”
Given n and k, return the kth permutation sequence.
Note:
Given n will be between 1 and 9 inclusive.
Given k will be between 1 and n! inclusive.
Example
Example 1:
Input: n = 3, k = 3
Output: “213”
Example 2:
Input: n = 4, k = 9
Output: “2314”
Submissions
由题目描述可以看出所有的排列的出现是有规律的,从第一位开始,1,2,3,第二位,2,3;1,3;1,2(除第一位后数字都按从小到大的顺序出现),第三位……因此可直接定位第k个排列。
本题解题思路采用顺序按位寻找的方法,每一次循环寻找一位。当寻找第一位时,第一位后面的元素共用n-1的阶乘种可能,所以用k除以n-1的阶乘并向上取整来确定第一位位于第temp个n-1的阶乘内,此时的temp即代表第一位为从1到n的列表num内的第temp个数,temp-1即为第一位。找到第一位后,保存到列表rel中,将此数从num列表中移除,并将k减去temp前面n-1阶乘的个数。后面的每一位以此类推。
其中,math.factorial(n) 是求n的阶乘;math.ceil(n) 是对n向上取整。
实现代码如下:
class Solution:
def getPermutation(self, n: int, k: int) -> str:
num = list(range(1,n+1))
rel = []
while num:
fenmu = math.factorial(len(num)-1)
temp = math.ceil(k/fenmu)
value = num[temp-1]
rel.append(value)
num.remove(value)
k = k- (k // fenmu)*fenmu
res = []
for i in rel:
res.append(str(i))
return ''.join(res)