zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    c#中Split等分割字符串的几种方法
    js中的null和undefined的区别
    限制CheckBoxList选中的数量
    js中的boolean原始类型和Boolean引用类型
    div漂浮在flash上面
    关于导出excel是经常出现的几个问题
    关于表的合并
    框架
    Js实现类似图片相册左右切换效果
    DNS域名系统
  • 原文地址:https://www.cnblogs.com/mgdzy/p/13441006.html
Copyright © 2011-2022 走看看