https://leetcode.com/problems/permutation-sequence/description/
给一个n,k,求1~n的全排列所有结果中第k个序列。
思路1:先求全排列(参考46. Permutations,用回溯法求),然后在所有结果中找第k个。这样会超时。
思路2:由于全排列按字典序,因此可以通过方法把所求序列计算出来。
例如求1~9的全排列的第360000个序列,从最高位开始,9!= 362880 = 8!* 9
,因此360000 // 8! = 8
,可知另8个数全排列的话,360000可以将第9个数排完8种情况,而且数字不能重复取,这个数只有可能是9,将9取出,放在最高位。剩下的情况有360000 % 8 = 37439
种,进入下一轮迭代。
37439 // 7! = 7
,说明1~8可以取完7个数字的全排列,只有可能最高位是8,37439 % 7! = 2159
,进入下一轮。
2159 // 6! = 2
,说明1~7可以取两种,剩下的数中可以保证取两种的最小数是3.
以此类推。
class Solution:
def getPermutation(self, n, k):
num = []
for i in range(1, n+1):
num.append(i)
fact = [0]*n
fact[0] = 1
for i in range(1, n):
fact[i] = i * fact[i-1]
k -= 1
record = []
for i in range(n, 0, -1):
ind = k // fact[i-1]
k = k % fact[i-1]
record.append(num[ind])
num.remove(num[ind]) #移出
res = ''
for i in record:
res += str(i)
return res