60. 第k个排列

给出集合 [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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路见题解:https://leetcode-cn.com/problems/permutation-sequence/solution/hui-su-jian-zhi-python-dai-ma-java-dai-ma-by-liwei/

 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 }

 

posted @ 2019-09-30 21:38  赤云封天  阅读(174)  评论(0编辑  收藏  举报