60. 排列序列

60. 排列序列
-> 方式一:找规律
    eg:n=3,k=3
        '123' '132' '213'
        '231' '312' '321'
        每个首位1 2种 即找到3/2即可
-< 代码:
class Solution:
    def getPermutation(self, n: int, k: int) -> str:
        num = [str(i) for i in range(1, n+1)]#生成1到n的列表以str形式存储
        res = ''
        n-=1 # 如果第一个数确定了,则后续阶乘为(n-1)!,所以需要自减1(1后续有俩种情况)
        while n>-1:
            t = math.factorial(n)
            loc = math.ceil(k / t) - 1
            res += num[loc]
            num.pop(loc)
            k %= t
            n -= 1
        return res

k=3时, 目标排列是 213,怎么找到的,如下

因为确定第1位的数时, 每个数后续可能的阶乘都是 (n-1)!=2!=2, 即如果第一位是1, 则后续就只有{2,3}, {3, 2} 两种可能,第一位是其他数也一样。

用 k / (n-1)! = 3 / 2 = 1 不整除,余数为1, 说明第一个位置的数即使用了{1,2,3}的第一个数1,还是无法满足k, 所以第一个位置要用 {1,2,3}的第二个数即2,所以用2。 剩余{1, 3}, k 更新为1, n 更新为2

用 k / (n-1)! = 1 / 1 = 1 整除,余数为0, 说明第二个位置的数得用了{1, 3}的第一个数1。 此时剩余{3}, n=1,k=余数=0,所以下次直接取剩余数的最后一个数

确定第三个位置的数时, 剩余{3}, k=0, 直接取最后一个数

 

 
posted @ 2022-07-31 15:29  是冰美式诶  阅读(30)  评论(0)    收藏  举报