LeetCode 60 第k个排列
LeetCode60 第k个排列
题目描述
给出集合 [1,2,3,...,n],其所有元素共有 n! 种排列。
按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:
"123"
"132"
"213"
"231"
"312"
"321"
给定 n 和 k,返回第 k 个排列。
样例
输入:n = 3, k = 3
输出:"213"
输入:n = 4, k = 9
输出:"2314"
输入:n = 3, k = 1
输出:"123"
算法分析
- 枚举每个位置
- 从高位到低位依次考虑每一位;
- 对于每一位,从小到大依次枚举未使用过的数,确定当前位是几
时间复杂度
Java代码
class Solution {
public String getPermutation(int n, int k) {
boolean[] st = new boolean[10];
int[] f = new int[10]; //存的阶乘
f[0] = 1;
for(int i = 1; i <= n; i++){
f[i] = f[i - 1] * i;
}
String ans = "";
for(int i = 0; i < n; i ++){
for(int j = 1; i <= n; j++){
if(!st[j]){
if(k <= f[n-i-1]){
ans = ans + "" + j;
st[j] = true;
break;
}
k -= f[n-i-1];
}
}
}
return ans;
}
}

浙公网安备 33010602011771号