• leetcode刷题-60第k个队列


    题目

    给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。

    按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:

    "123"
    "132"
    "213"
    "231"
    "312"
    "321"
    给定 n 和 k,返回第 k 个排列。

    说明:

    给定 n 的范围是 [1, 9]。
    给定 k 的范围是[1,  n!]。

    示例 1:

    输入: n = 3, k = 3
    输出: "213"

    思路

    最开始的想法是列出全排列后,选出第k个,但是时间效率太低无法通过。看了官网解答也没看懂,后来发现可以用找规律的方式来确定。

    以示例为例,所有排列可以理解为1+(2,3)的排列,2+(1,3)的排列,3+(1,2)的排列。当k =3时,其一定存在于k//(n-1)!=2//2!=1中(k需要-1,因为索引起始为0),因此其在数组[1,2,3]的索引为1,其值为2,其余数为0,在(2,3)的排列排列中,其存在与0//1! = 0中(k =2)其值为1,最后在(3)的排列中,由此得到"213".

    实现

    class Solution:
        def getPermutation(self, n: int, k: int) -> str:
            nums = [str(i) for i in range(1,n+1)]
            result = ''
            k = k-1
            def factorial(n):
                sum=1
                for i in range(1,n+1):
                    sum*=i
                return sum
            
            while n > 0:
                n -= 1
                num, k = divmod(k, factorial(n))
                result += nums.pop(num)
            return result
  • 相关阅读:
    python之九九乘法表
    python选择排序有序区域和无序区域
    mysql学习笔记(一)
    cuda toolkit安装
    vs 无法打开输入文件“kernel32.lib”
    vs libtorch 无法定位程序输入点…于动态链接库…exe
    libtorch 部署 windows10
    openvino记录
    AcWing 803.区间合并
    AcWing 802.区间和
  • 原文地址:https://www.cnblogs.com/mgdzy/p/13441006.html
Copyright © 2020-2023  润新知