题目
集合[1,2,3,...,n]包含总共n!个不同的排列。 通过按顺序列出和标记所有排列, 我们得到以下序列(即n = 3): “123” “132” “213” “231” “312” “321” 给定n和k,返回第k个序列。 注意:给定n将介于1和9之间。
分析过程
回溯法。 如何找出第16个(按字典序的){1,2,3,4,5}的全排列? 1. 首先用16-1得到15 2. 用15去除4! 得到0余15 3. 用15去除3! 得到2余3 4. 用3去除2! 得到1余1 5. 用1去除1! 得到1余0 有0个数比它小的数是1,所以第一位是1 有2个数比它小的数是3,但1已经在之前出现过了所以是4 有1个数比它小的数是2,但1已经在之前出现过了所以是3 有1个数比它小的数是2,但1,3,4都出现过了所以是5 最后一个数只能是2
代码实现
import java.util.*;
public class Solution {
public String getPermutation(int n, int k) {
ArrayList<Integer> list = new ArrayList<> ();
k=k-1;//
for(int i = n-1;i >= 0;i--){
int sum = factorial(i);
int temp = k/sum;
for(int j = 1;j <= n;j++){
if(!list.contains(j)){
temp--;
if(temp < 0){
list.add(j);
break ;
}
}
}
k = k%sum;
}
String res = "";
for(int i = 0;i < n;i++){
res += list.get(i);
}
return res ;
}
public int factorial(int n){
int sum=1;
for(int i=n;i>=1;i--){
sum*=i;
}
return sum;
}
}
题目来自牛客网leetcode