[leetcode]Permutation Sequence @ Python


原題地址: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):

  1. "123"
  2. "132"
  3. "213"
  4. "231"
  5. "312"
  6. "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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM