给出集合 [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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
1 public class Solution { 2 private boolean[] flag = null; 3 private boolean ok = false; 4 private char[] res = null; 5 6 private int jie(int n){ 7 if (n < 0) return -1; 8 int cnt = 1; 9 while (n > 0){ 10 cnt *= n--; 11 } 12 return cnt; 13 } 14 15 // count:未使用数字的个数 16 private boolean helper(int n, int count, int k){ 17 if (count == 0) { 18 ok = true; 19 return true; 20 } 21 for (int i = 1; i <= n; i++) { 22 if (!flag[i]) { 23 // 计算分支i的序列个数 24 int cnt = jie(count-1); 25 if (k > cnt) { 26 k -= cnt; 27 continue; 28 } 29 // k <= cnt 进入当前分支i 30 flag[i] = true; 31 res[n-count] = (char)(i+'0'); 32 if (helper(n,count-1,k)) 33 return true; 34 } 35 } 36 return false; 37 } 38 39 public String getPermutation(int n, int k) { 40 flag = new boolean[n+1]; 41 res = new char[n]; 42 helper(n, n, k); 43 return new String(res); 44 } 45 46 public static void main(String[] args) { 47 String permutation = new Solution().getPermutation(3,3); 48 System.out.println("permutation = " + permutation); 49 } 50 }