leetcode60. 第k个排列

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_36811967/article/details/87692792

给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。
按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:
“123”
“132”
“213”
“231”
“312”
“321”
给定 n 和 k,返回第 k 个排列。

说明:
给定 n 的范围是 [1, 9]。
给定 k 的范围是[1, n!]。
示例 1:
输入: n = 3, k = 3
输出: “213”
示例 2:
输入: n = 4, k = 9
输出: "2314"

主要思路是根据k值和n-1的阶乘求得最先一位的数,以此类推后面的:

class Solution:
    def getPermutation(self, n, k):
        """
        :type n: int
        :type k: int
        :rtype: str
        """
        def get_n(n):  # 求解n的阶乘
            res = 1
            for i in range(1, n+1):
                res *= i
            return res
        ret, nums = '', list(map(str, list(range(1, n+1))))
        for i in range(n, 0, -1):
            res = get_n(i-1)
            index = (k-1) // res  # 找到第一位的位置
            ret += nums.pop(index)
            k -= res*index  # 求后面剩余数的第k个
        return ret

猜你喜欢

转载自blog.csdn.net/sinat_36811967/article/details/87692792