The set [1,2,3,…,n]
contains a total of n! unique permutations.
By listing and labeling all of the permutations in order,
We get the following sequence (ie, for n = 3):
"123"
"132"
"213"
"231"
"312"
"321"
Given n and k, return the kth permutation sequence.
题意:给定n和k,求出n的排列中第k个排列;
这个题初一看,第一想法是列出所有的排列,然后找到第k个。但是仔细一想,还是有另外一种简单的解法:
我们先思考第k个排列的第一位,显然,
当1<=k<=(n-1)!的时候,第一位数就是1.
当(n-1)!<=k<=2*(n-1)! 的时候,第一位数就是2.
……
以此类推,我们可以求出第k个排列的第一位数。
接下来,我们假设第一位数为i,那么,我们开始计算第二位数,此时k = k-(i-1)*(n-1)!.重复上面的过程我们可以得到第二位数,第三位数……第n位数。也就得到了此题的答案。
下面是代码:
public class Solution {
public String getPermutation(int n, int k) {
List<Integer> list = new LinkedList<>();
int num = 1;
while(num <= n){ //将1-n按顺序放入list中
list.add(num++);
}
StringBuilder sb = new StringBuilder();
for(int i=0;i<n;i++){
int c = (k-1)/jc(n-i-1); //计算第i位数在list中的下标
k = k-c*jc(n-i-1); //更新k值,准备计算下一位数
sb.append(list.remove(c));
}
return sb.toString();
}
public int jc(int a){ //计算阶乘
if(a == 0 || a==1)
return 1;
int num = 1;
for(int i=0;i<a;i++){
num = num*(i+1);
}
return num;
}
}
这个方法的时间复杂度位O(n),解题思路也很清晰,在LeetCode上超越了77%左右的答案,还算不错。