给出集合 [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"
看见这个题目我首先就是先走全排列,然后根据K值返回答案。
可是这样写时间复杂度很为 nlogn
n = 9的时候没撑住。
当然我这个全排还可以优化一下,走到第k就返回终止,但是如果k的值是最后一个复杂度还是一样,还是过不了。所以我决定重新思考。
这一次我开始从他全排规律下手
这是n为5 12开头的全部组合,其中3到5已经全部变换完成,在下就是13开头了 13245...
接下来开始找规律:
我们先看4 5两个数,4 和 5 开头分别只有一次
再看3 4 5,分别有2次
再看2 3 4 5,分别有6次
有了这个规律我们就可以迅速找到 0-n 位为什么数。
假如 n 为 5 k = 10
str = 1 2 3 4 5
首先看 第10是否在 1开头 的 全组合 里面,n为5的单个全组有24个。
所以 在里面。
然后递归找2字开头n为4,10/6 = 1,交换 2 与 3
现在是 1 3 开头 后面跟 2 4 5
然后再递归