[LeetCode]60. 排列序列(java实现)模拟题
1. 题目
2. 读题(需要重点注意的东西)
思路:
每一位每一位来看,举个例子,当n = 4,k = 10时:
当第一位填1时,后面有(4-1)!
= 3 *2 * 1 = 6种排列,此时10 > 6,说明第一位填1的6个排列都在第10个排列的前面,因此第一位填2;
第二位填1时,后面有(3-1)! = 2 * 1 = 2种排列,此时10 > 6 + 2,此时已经存在了8
种排列,因此第二位填3;
第三位填1时,有一种排列,10 > 6 + 2 + 1,此时已经存在了9种排列,因此第三位填4;
第四位填1,刚好是第 6 + 2 + 1 + 1 = 10种排列。
模拟了人进行计算的过程。
3. 解法
---------------------------------------------------解法---------------------------------------------------:
class Solution {
public String getPermutation(int n, int k) {
String res = "";
boolean[] st = new boolean[n+10];
for(int i = 0;i < n;i++){
int fact = 1;
// 算一下后面的排列有多少种
for(int j = 1;j < n - i;j++) fact = fact * j;
// 枚举这一位填哪个数,j每多加1,方案数减少fact个
for(int j = 1;j <= n;j++){
if(st[j] == false){
if(fact < k) k-=fact;
else{
res += Integer.toString(j);
st[j] = true;
// 这里不终止的话j还会继续走
break;
}
}
}
}
return res;
}
}
可能存在的问题: