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 @   是冰美式诶  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示