LeetCode-60 Permutation Sequence

Description

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 for n = 3:
“123”
“132”
“213”
“231”
“312”
“321”
Given n and k, return the kth permutation sequence.

Note:
Given n will be between 1 and 9 inclusive.
Given k will be between 1 and n! inclusive.

Example

Example 1:
Input: n = 3, k = 3
Output: “213”

Example 2:
Input: n = 4, k = 9
Output: “2314”

Submissions

由题目描述可以看出所有的排列的出现是有规律的,从第一位开始,1,2,3,第二位,2,3;1,3;1,2(除第一位后数字都按从小到大的顺序出现),第三位……因此可直接定位第k个排列。
本题解题思路采用顺序按位寻找的方法,每一次循环寻找一位。当寻找第一位时,第一位后面的元素共用n-1的阶乘种可能,所以用k除以n-1的阶乘并向上取整来确定第一位位于第temp个n-1的阶乘内,此时的temp即代表第一位为从1到n的列表num内的第temp个数,temp-1即为第一位。找到第一位后,保存到列表rel中,将此数从num列表中移除,并将k减去temp前面n-1阶乘的个数。后面的每一位以此类推。
其中,math.factorial(n) 是求n的阶乘;math.ceil(n) 是对n向上取整。

实现代码如下:

class Solution:
    def getPermutation(self, n: int, k: int) -> str:
        num = list(range(1,n+1))
        rel = []
        while num:
            fenmu = math.factorial(len(num)-1)
            temp = math.ceil(k/fenmu)
            value = num[temp-1]
            rel.append(value)
            num.remove(value)
            k = k- (k // fenmu)*fenmu
        res = []
        for i in rel:
            res.append(str(i))
        return ''.join(res)

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值