60第K个排列

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

来源: https://leetcode-cn.com/problems/permutation-sequence/

法一:自己的代码    耗时很短,利用python自带的阶乘函数计算耗时会更短

思路:转化为一个纯数学的问题,关键是要把每种情况都考虑到,特别是除n!后是整数的情况,举例的时候就要把每种情况都枚举到,编程才不会出错

import math
class Solution:
    def getPermutation(self, n: int, k: int):
        # 自定义阶乘函数
        def n_factorial(x):
            if x == 0:
                return 1
            else:
                return x * n_factorial(x-1)
        nums = [i+1 for i in range(n)]
        result = ''
        while n > 0:
            n = n - 1
            # 通过观察数据可以看出,假如输入是(4,9),则说明以1开头的有3!个,以2开头的有3!个,
            # 所以用9除以3的阶乘是1.5,1,5向上取整为2,即nums中的第二个数2是结果中的第一个数,
            # 再用9减去6为3表示从2开始的组别中找第三个数,
            res = k / n_factorial(n)
            res_up = math.ceil(res)
            # 注意这里向下取整必须是向上取整后减1,这是因为比如输入的是(4,6),则6除3!为1,1-1=0,所以不可直接向下取整
            res_down = res_up - 1
            k = k - res_down * n_factorial(n)
            result = result + str(nums[res_up-1])
            del nums[res_up-1]
            print('-'* 20)
            print('k', k)
            # print(res)
            print(res_up)
            # print(res_down)
        return result
if __name__ == "__main__":
    duixiang = Solution()
    a = duixiang.getPermutation(4,9)
    print(a)
View Code

法二:自己的代码    利用回溯,但是超时

猜你喜欢

转载自www.cnblogs.com/xxswkl/p/11949915.html