题目
给出集合 [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"
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/permutation-sequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
无官方题解
感想
总体思路就是:从第一位开始,第i位的值就是依次根据k/(n-i-1)!的结果来判断应该选取第几大的数。之前用过的数将不能再次使用。这样直接把所求的字符串拼接出来。
执行用时 :2 ms, 在所有Java提交中击败了99.76%的用户
内存消耗 :33.5 MB, 在所有Java提交中击败了98.11%的用户
class Solution {
public String getPermutation(int n, int k) {
boolean[] choosed = new boolean[n];//choosed[i]存储的是i+1是否被使用
int[] factorial = new int[n-1];//factorial[i]存储的是i+1的阶乘
int temp=1;
for(int i =1;i<n;i++){
temp*=i;
factorial[i-1]=temp;
}
StringBuilder sb = new StringBuilder();
k--;//这里不能少,毕竟我们是从0开始数,而给的k是从1开始。
for(int i=n-2;i>=0;i--){
int count = 0;
int index = -1;
while(count<k/factorial[i]+1){
index++;
if(!choosed[index]){
count++;
}
}
choosed[index]=true;
sb.append(index+1);
k%=factorial[i];
}
for(int i=0;i<choosed.length;i++){
if(!choosed[i]){
sb.append(i+1);
break;
}
}
return sb.toString();
}
}