问题描述:给定1-n个整数,将这N个数字做全排列,求第K个排列,结果用String形式返回。
分析:
对于{1,2,3,4}的全排列来说,可以是:
1+{2,3,4}的全排列;
2+{1,3,4}的全排列;
3+{1,2,4}的全排列;
4+{1,2,3}的全排列;
假如我们要求第十五个全排列,那么我们的流程应该是
k=15-1
i=1;
14/3!=2=>数组{1,2,3,4}中第三个数字是3,将数组中的3除去,此时数组为{1,2,4};
更新K=14-2*3!=2;
k=2
i=2;
2/2!=1=>数组{1,2,4}中的第二个数字是2,将3从数组中得到新的数组{1,4};
….
最后可以得到结果:3214
思路已经理清楚,接下来就是代码的实现了:
import java.util.ArrayList;
import java.util.List;
/**
* 给定一个n,在从1-n的数字的 全排列中找到第k个全排列
*
* @version 2017/7/21.21:33
*/
public class K_th_Permutation {
public static void main(String[] args) {
System.out.println(new K_th_Permutation().getPermutation(4, 15));
}
public String getPermutation(int n, int k) {
List<Integer> list = new ArrayList<>();
int[] factorial = new int[n + 1];
StringBuilder builder = new StringBuilder();
// create an array of factorial lookup
//求n的阶乘
int sum = 1;
factorial[0] = 1;
for (int i = 1; i <= n; i++) {
sum *= i;
factorial[i] = sum;
}
// factorial[] = {1, 1, 2, 6, 24, ... n!}
// create a list of list to get indices
for (int i = 1; i <= n; i++)
list.add(i);
// list = {1, 2, 3, 4}
k--;
for (int i = 1; i <= n; i++) {
int index = k / factorial[n - i];
builder.append(String.valueOf(list.get(index)));
list.remove(index);
k -= index * factorial[n - i];
}
return String.valueOf(builder);
}
}