题目:给出集合 [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)
法二:自己的代码 利用回溯,但是超时