1.问题重述
给出集合 [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”
2.问题分析
本来想着拿回溯做的,但是学习太死板了,就开始用其他的偏路子,最后找出的偏路子,每个数的全排列都是3!个,也就是说1 + 对2,3,4的全排列 (3!个) ,2,3,4同理,先用List容器进行数的存放,之后确定第一位,即 index = k / (n-1)! = 2, 说明第15个数的第一位是3 ,2,3,4同理
3.代码
class Solution {
public String getPermutation(int n, int k) {
StringBuilder sb = new StringBuilder();
// 候选数字
List<Integer> candidates = new ArrayList<>();
// 分母的阶乘数
int[] factorials = new int[n+1];
factorials[0] = 1;
int fact = 1;
for(int i = 1; i <= n; ++i) {
candidates.add(i);
fact *= i;
factorials[i] = fact;
}
k -= 1;
for(int i = n-1; i >= 0; --i) {
// 计算候选数字的index
int index = k / factorials[i];
sb.append(candidates.remove(index));
k -= index*factorials[i];
}
return sb.toString();
}
}
4.结果
学习别人的想法,不用多说