题目链接
英文链接:https://leetcode.com/problems/permutation-sequence/
中文链接:https://leetcode-cn.com/problems/permutation-sequence/
题目详述
给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。
按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:
- “123”
- “132”
- “213”
- “231”
- “312”
- “321”
给定 n 和 k,返回第 k 个排列。
说明:
- 给定 n 的范围是 [1, 9]。
- 给定 k 的范围是[1, n!]。
示例 1:
1 | 输入: n = 3, k = 3 |
示例 2:
1 | 输入: n = 4, k = 9 |
题目详解
- 可以按顺序求出第 k 个排列。
- 时间复杂度为
O(k)
。
1 | public class LeetCode_00060 { |
- 实际上,可以不用按顺序求出每一个排列,可以直接跳过前面的排列。当某一位确定后,可以知道有多少种排列,处于前面的排列可以不用求,然后再确定下一位。
- 从高位到低位考虑,对于每一位,从未使用过的数中确定当前位是几。
- 以 n = 4,k = 14 为例:
- 1 + (2、3、4 的排列)
- 2 + (1、3、4 的排列)
- 3 + (1、2、4 的排列)
- 4 + (1、2、3 的排列)
- 每组的排列个数为
3! = 6
个,显然第 14 个排列在第 3 组中,所以第 1 位是 3。接下来确定后面的位,即在 1、2、4 的排列中找第14 - 6 * 2 = 2
个排列。 - 因为
2! = 2
,2 / 2 = 1
,2 - 2 * 0 = 2
,所以确定处于第 1 组中,即这一位为 1。接下来在 2、4 的排列中找第 2 个排列。 - 因为
1! = 1
,2 / 1 = 2
,2 - 1 * 1 = 1
,所以确定处于第 2 组中,即这一位为 4。接下来在 2 的排列中找第 1 个排列。 - 逐位得出第 14 个排列为 3142。
- 时间复杂度为
O(n^2)
。
1 | public class LeetCode_00060 { |