【5分钟力扣】60.第K个排列

本文解析了LeetCode上的排列序列问题,详细介绍了如何通过递归算法求解给定n和k时的第k个全排列,适用于n在1到9之间的场景。文章通过实例解释了解题思路,并提供了Python代码实现。

一、前言

程序不是年轻的专利,但是,他属于年轻。

每天五分钟,看懂一道简单、中等难度的算法题,尽可能将复杂的题讲清楚。

疯狂学习python中,2020-09-05更新

在这里插入图片描述

二、题目

给出集合 [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”

示例 2:

输入: n = 4, k = 9
输出: “2314”

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/permutation-sequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

三、解题思路

按照题意可知, 当n个不同的元素(1, 2, 3, 4, 5, 6…,n)可以组成的全排列总数目为 N!

按照全排列公式可知,总数目为:
N ! = n ∗ ( n − 1 ) . . . . ∗ 1 N! = n*(n-1) ....* 1 N!=n(n1)....1
根据公式可以推导:
N ! = ( N − 1 ) ! ∗ N N! = (N-1)! *N N=N1!N

以 n= 4为例,全排列结果为:

在这里插入图片描述

当K=9时:

  1. 以1开头的组合最多个数为 (4-1)! = 6个,以2开头的组合也为(4-1)! = 6个,所以这个排序是【2,# , # , #】开头。
  2. 剩下组合为【1,3,4】,以 1开头的有2个,以3开头的有2个。已知9-6=3,K处于这个组合的第三位,可知排序为【2,3,#,#】
  3. 剩下组合为【1,4】此时9-6-3=0,以1开头的只有1个,推导排序为【2,3,1,4】

四、代码示例

class Solution:
    def getPermutation(self, n: int, k: int) -> str:

        # 递归
        def recursion(n):
            return 1 if n == 0 else n * recursion(n-1)

        nums = [str(i+1) for i in range(n)]
        k = k - 1 # 是以下标取值
        res = ""
        while nums:
            temp = recursion(len(nums)-1)
            index = int(k/temp)
            res += nums.pop(index)
            k -= index*temp
        return res


if __name__ == '__main__':
    obj = Solution()
    obj.getPermutation(4, 9)
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值