[分析]
思路1:调用 k 次NextPermutation.
思路2:数学解法,在n!排列中,每个第一位元素带领 (n-1)! 个排列数,假设 p = k / (n-1)!,则num[p]就是第一位上的数字,注意 k 要从0开始计数,因此进主循环前k--。
类似的方法求出剩下位置的数字。参考:
http://blog.csdn.net/doc_sgl/article/details/12840715
http://m.blog.csdn.net/blog/linhuanmars/22028697
public class Solution { public String getPermutation(int n, int k) { if (n <= 0 || n > 9) return ""; int[] num = new int[n]; for (int i = 0; i < n; i++) num[i] = i + 1; int factorial = 1; for (int i = 2; i <= n; i++) factorial *= i; StringBuilder result = new StringBuilder(n); k--; for (int i = 0; i < n; i++) { factorial /= n - i; int selectIdx = k / factorial; result.append(num[selectIdx]); k %= factorial; for (int j = selectIdx; j < n - i - 1; j++) num[j] = num[j + 1]; } return result.toString(); } public String getPermutation1(int n, int k) { if (n <= 0 || n > 9) return ""; int[] num = new int[n]; for (int i = 0; i < n; i++) num[i] = i + 1; for (int i = 1; i < k; i++) nextPermutation(num); StringBuilder result = new StringBuilder(n); for (int i = 0; i < n; i++) result.append(num[i]); return result.toString(); } public void nextPermutation(int[] num) { int p = num.length - 2; while (p >= 0 && num[p] >= num[p + 1]) p--; if (p >= 0) { int q = p + 1; while (q < num.length && num[q] > num[p]) q++; int tmp = num[--q]; num[q] = num[p]; num[p] = tmp; } int q = num.length - 1; p = p + 1; while (p < q) { int tmp = num[p]; num[p] = num[q]; num[q] = tmp; p++; q--; } } }