LeetCode 60. Permutation Sequence

简介: 集合[1,2,3,...,n]总共包含n的阶乘个独特的排列。

v2-9e37cb5ba6512a91403cd89e91442e70_1440w.jpg


Description



The set [1,2,3,...,n] contains a total of n! unique permutations.

By listing and labeling all of the permutations in order, we get the following sequence for n = 3:

"123"

"132"

"213"

"231"

"312"

"321"

Given n and k, return the kth permutation sequence.


Note:

Given n will be between 1 and 9 inclusive.

Given k will be between 1 and n! inclusive.


Example 1:

Input: n = 3, k = 3

Output: "213"


Example 2:

Input: n = 4, k = 9

Output: "2314"


描述



集合[1,2,3,...,n]总共包含n的阶乘个独特的排列。


通过按顺序列出和标记所有排列,我们得到n = 3的以下序列:

"123"

"132"

"213"

"231"

"312"

"321"

给定n和k,返回第k个排列序列。


注意:

给定n将介于1和9之间。

给定k将介于1和n的阶乘之间!闭区间。


思路



v2-c7346d05e1791a96172844307f1e774b_720w.jpg


  • 最直观的思路是把所有的排列求出来,然后直接返回第K个(下标为k-1),但是这样做既浪费时间,又浪费空间
  • 我们通过计算的方式来求得排列的每个数字,我们另nums=['1','2','3'···'k']
  • n个数的排列组合,同一个数字开头的排列组合共有(n-1)!个,因此
  • 我们有 denominator / numerator = quotient ··· remainder,即: k / (n-1)! = quotient ··· remainder①.
  • 我们把相同字母开头的组合称为一组,由上式①得到要求的序列在第quotient组的第remainder个,如上示意图.
  • 第quotient组开头的字母就是nums中的nums[quotient]元素(这里要注意:如果remainder==0,则是nums[quotient-1],表示第quotient组的第0个元素,即第quotient-1的最后一个元素)
  • 我们把当前的元素放到结果数组中,然后删除当前位置的元素,更新 denominator = remainder,n = n-1
  • 结束条件是denominator==0,此时我们确定了是第quotient-1组的最后一组元素,我们倒序把nums字符数组中剩余的元素添加到res中即可.


import math
class Solution:
    def getPermutation(self, n, k):
        """
        :type n: int
        :type k: int
        :rtype: str
        """
        nums = [str(i) for i in range(1, n+1)]
        res = []
        denominator, numerator = k, k
        while denominator:
            numerator = math.factorial(n-1)
            quotient = denominator//numerator
            remainder = denominator % numerator
            if remainder:
                res.append(nums[quotient])
                del nums[quotient]
            else:
                res.append(nums[quotient-1])
                del nums[quotient-1]
            denominator = remainder
            n -= 1
        return ''.join(res+nums[::-1])

源代码文件在这里.

目录
相关文章
LeetCode - 31. Next Permutation
31. Next Permutation Problem's Link  ---------------------------------------------------------------------------- Mean:  给定一个数列,求这个数列字典序的下一个排列.
820 0
|
索引
[LeetCode] Next Permutation
Well, in fact the problem of next permutation has been studied long ago. From the Wikipedia page, in the 14th century, a man named Narayana Pandita gi...
874 0
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行