美文网首页算法学习
算法题--给定数字n, 求第k个全排列

算法题--给定数字n, 求第k个全排列

作者: 岁月如歌2020 | 来源:发表于2020-04-16 03:03 被阅读0次
image.png

0. 链接

题目链接

1. 题目

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"

2. 思路1:递归

[1,2,3,4]的全排列可以写出:

1 --> (1, 2, 3, 4)
2 --> (1, 2, 4, 3)
3 --> (1, 3, 2, 4)
4 --> (1, 3, 4, 2)
5 --> (1, 4, 2, 3)
6 --> (1, 4, 3, 2)
7 --> (2, 1, 3, 4)
8 --> (2, 1, 4, 3)
9 --> (2, 3, 1, 4)
10 --> (2, 3, 4, 1)
11 --> (2, 4, 1, 3)
12 --> (2, 4, 3, 1)
13 --> (3, 1, 2, 4)
14 --> (3, 1, 4, 2)
15 --> (3, 2, 1, 4)
16 --> (3, 2, 4, 1)
17 --> (3, 4, 1, 2)
18 --> (3, 4, 2, 1)
19 --> (4, 1, 2, 3)
20 --> (4, 1, 3, 2)
21 --> (4, 2, 1, 3)
22 --> (4, 2, 3, 1)
23 --> (4, 3, 1, 2)
24 --> (4, 3, 2, 1)

从中可以看出

  • 1, 2, 3, 4开头的, 各有3!=6
  • 1开头的6个排列里,剩余值以2开头的有2!=2
  • 1,2开头的2个排列里, 剩余值以3开头的有1!=1
  • 在以1,2,3开头的排列里, 剩余值以4开头的有0!=1

可见,满足典型的递归规律, 详细如下所示:

  • 对于原问题, 即给定数组[1,2,3,4],要求出第9个排列
    可以从左到右依次确定每个数字
  • 显然第1个数字, 可以通过(9 - 1) // 3! = 1得到第一个数字在数组[1,2,3,4]中的下标,这样得到数字2
  • 1个数字确定后, 问题转化为子问题,即给定数组[1,3,4], 要求出第9 % 3!=3个排列的问题

3. 代码

# coding:utf8
from typing import List


class Solution:
    def find(self, nums: List[int], k: int, multi: int, results: List[str]):
        if len(nums) == 0:
            return
        if len(nums) == 1:
            results.append(chr(ord('0') + nums[0]))
            nums.pop(0)
            return
        else:
            head_idx = (k - 1) // multi
            results.append(chr(ord('0') + nums.pop(head_idx)))
            k = k % multi
            multi = multi // len(nums)
            self.find(nums, k, multi, results)

    def getPermutation(self, n: int, k: int) -> str:
        multi = 1
        for i in range(1, n):
            multi *= i

        nums = list(range(1, n + 1))
        results = list()
        self.find(nums, k, multi, results)
        return ''.join(results)


solution = Solution()
print(solution.getPermutation(3, 3))
print(solution.getPermutation(4, 9))

输出结果

213
2314

4. 结果

image.png

相关文章

  • 算法题--给定数字n, 求第k个全排列

    0. 链接 题目链接 1. 题目 The set [1,2,3,...,n] contains a total o...

  • K-th Smallest in Lexicographical

    题目来源给两个数字n和k,求按字母序排列的第k个数字。 Given integers n and k, find ...

  • 排列类算法问题大总结

    全排列 带重复元素的排列 下一个排列 上一个排列 第 k 个排列 排列序号 排列序号II 全排列 给定一个数字列表...

  • 输出数组的全排列

    思想: n 个元素数组全排列 = 第 1 个前缀 + 后 n - 1 个元素全排列 输出第 k 个元素之后的全排列...

  • 贪心算法删数问题

    删数问题 给定n位正整数a,去掉其中任意k个数字后,剩下的数字按原次序排列组成一个新的正整数。对于给定的n和k,设...

  • LintCode 90 [k Sum II]

    原题 给定n个不同的正整数,整数k(1<= k <= n)以及一个目标数字。在这n个数里面找出K个数,使得这K个数...

  • 搜索-组合

    刷题学习的第一类算法,由深度优先搜索DFS引申出的,排列组合算法。在一个给定长度n的数组中取出k个数,做组合或者排...

  • 441-排列硬币

    排列硬币 题目 你总共有n枚硬币,你需要将它们摆成一个阶梯形状,第k行就必须正好有k枚硬币。 给定一个数字n,找出...

  • 字符串全排列

    题目描述 对给定的n位字符串全排列 解题思路 n位的字符串的全排列,先确定第0位,然后对后面n-1位进行全排列,在...

  • 全排列(无重复序列)

    题目:给定一个 没有重复 数字的序列,返回其所有可能的全排列。示例: 这是一个全排列组合的算法!因为题目已经告诉我...

网友评论

    本文标题:算法题--给定数字n, 求第k个全排列

    本文链接:https://www.haomeiwen.com/subject/lsflvhtx.html