版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m940034240/article/details/89137077
题目
给出集合 [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"
解法
class Solution {
public String getPermutation(int n, int k) {
StringBuilder s = new StringBuilder();
Set<Integer> set = new HashSet<>();
return add(set,s,n,k);
}
//从高位到低位逐个写入
public String add(Set<Integer> set, StringBuilder s,int n, int k){
int z = 1;
int left = n - s.length();
for(int i = 1; i<left;i++){//计算剩余left-1个数字中有多少种排序方式
z = z * i;
}
int a = k/z;//当前应该填入的数字在剩余的数字中排第几位
int b = k%z;//剩余序列
if(b==0){//剩余序列为0,填入最高位后直接从大到小填入剩下的数
int count = 0;
for(int i = 1; i<=n;i++){
if(!set.contains(i)){
count++;
if(count == a){
s.append(i);
set.add(i);
break;
}
}
}
for(int i = n; i>0;i--){
if(!set.contains(i)){
s.append(i);
set.add(i);
}
}
return s.toString();
}
//剩余序列大于0,排位进一位
a = a+1;
int count = 0;
for(int i = 1; i<=n;i++){
if(!set.contains(i)){
count++;
if(count == a){
s.append(i);
set.add(i);
break;
}
}
}
//往下一步递归
return add(set, s, n, b);
}
}