60第k个排列

给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。

按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:

  1. “123”
  2. “132”
  3. “213”
  4. “231”
  5. “312”
  6. “321” 给定 n 和 k,返回第 k 个排列。

说明:

  • 给定 n 的范围是 [1, 9]。
  • 给定 k 的范围是[1,  n!]。 示例 1:
    输入: n = 3, k = 3
    输出: "213"
    

    示例 2:

    输入: n = 4, k = 9
    输出: "2314"
    

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/permutation-sequence 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

Solution 1

每次找一个元素加入结果

class Solution:
    def getPermutation(self, n: int, k: int) -> str:
        result = ""
        nums = list(map(str, range(1, n+1)))
        k -= 1
        length = n
        for _ in range(n):
            length -= 1
            index = int(k / self.factorial(length))
            k %= self.factorial(length)
            result += nums.pop(index)
        return result

    def factorial(self, n):
        """
        if type(n) is not int:
            return None
        if (n == 0):
            return 1
        return n * self.factorial(n-1)
        """
        factorialResult = [
            1,
            1,
            2,
            6,
            24,
            120,
            720,
            5040,
            40320,
            362880,
        ]
        return factorialResult[n]