0060. 第 k 个排列
题目地址(60. 第 k 个排列)
https://leetcode-cn.com/problems/permutation-sequence/
题目描述
前置知识
数学
回溯
factorial
公司
阿里
百度
字节
Twitter
思路
LeetCode 上关于排列的题目截止目前(2020-01-06)主要有三种类型:
生成全排列 46. 全排列 47. 全排列 II
生成下一个排列 31. 下一个排列
生成第 k 个排列(我们的题目就是这种)
我们不可能求出所有的排列,然后找到第 k 个之后返回。因为排列的组合是 N!,要比 2^n 还要高很多,非常有可能超时。我们必须使用一些巧妙的方法。
我们以题目中的 n= 3 k = 3 为例:
"123"
"132"
"213"
"231"
"312"
"321"
可以看出 1xx,2xx 和 3xx 都有两个。如果你了解阶乘的话,应该知道这实际上是 2!个。
以上面的例子为例,假设我们想要找的是第 3 个。那么我们可以直接跳到 2 开头,因为我们知道以 1 开头的排列有 2 个,可以直接跳过,问题缩小了。
于是我们将 2 加入到结果集的第一位,不断重复上述的逻辑,直到结果集的长度为 n 即可。
关键点解析
找规律
排列组合
代码
语言支持: Python3
复杂度分析
时间复杂度:$O(N^2)$
空间复杂度:$O(N)$
最后更新于