原題地址:https://oj.leetcode.com/submissions/detail/5341904/
題意:
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 (ie, 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.
解題思路:剛開始用dfs,但一直TLE。貌似用java和c++寫dfs可以過,看來python確實慢啊。只能采用一種更巧妙的思路了。
其實本題數據不大,n最多為9,9! = 362880,枚舉應該能夠通過(我沒試驗)。
我采用的方法是計算第k個Permutation。
假設n = 6,k = 400
先計算第一位,
第一位為6,那么它最少也是第5! * 5 + 1個排列,這是因為第一位為1/2/3/4/5時,都有5!個排列,因此第一位為6時,至少是第5! * 5 + 1個排列(這個排列為612345)。
5! * 5 + 1 = 601 > k,所以第一位不可能是6.
一個一個地枚舉,直到第一位為4時才行,這時,4xxxxx至少為第5! * 3 + 1 = 361個排列。
然后計算第二位,
與計算第一位時的區別在於,46xxxx至少為第4! * 4 + 1 = 97個排列,這是因為比6小的只有5/3/2/1了。
最后可以計算出第二位為2。
最終得出第400個排列為425361。
代碼:
class Solution: # @return a string # def dfs(self, n, k, string, stringlist): # if len(stringlist) == n: # Solution.count += 1 # if Solution.count == k: # print stringlist # return # for i in range(len(string)): # self.dfs(n, k, string[:i]+string[i+1:], stringlist+string[i]) # def getPermutation(self, n, k): # string = '' # for i in range(n): string += str(i+1) # Solution.count = 0 # self.dfs(n, k, string, '') def getPermutation(self, n, k): res = '' k -= 1 fac = 1 for i in range(1, n): fac *= i num = [1, 2, 3, 4, 5, 6, 7, 8, 9] for i in reversed(range(n)): curr = num[k/fac] res += str(curr) num.remove(curr) if i !=0: k %= fac fac /= i return res