File tree Expand file tree Collapse file tree 1 file changed +66
-0
lines changed
problems/60. Permutation Sequence Expand file tree Collapse file tree 1 file changed +66
-0
lines changed Original file line number Diff line number Diff line change
1
+ # 60. Permutation Sequence
2
+
3
+ ## #1 回溯法[ TLE]
4
+
5
+ ### 思路
6
+
7
+ 采用深度优先递归遍历,用一个数组记录已经采用的数字,当递归深度大于n的时候,就把结果保存下来,时间复杂度太高。
8
+
9
+ ### 算法
10
+
11
+ ``` java
12
+ class Solution {
13
+ private List<String > res = new ArrayList<> ();
14
+ public String getPermutation (int n , int k ) {
15
+ boolean [] used = new boolean [n+ 1 ];
16
+ backtrack(n, used, new StringBuffer (), 1 );
17
+ return res. get(k- 1 );
18
+ }
19
+
20
+ public void backtrack (int n , boolean [] used , StringBuffer sb , int step ){
21
+ if (step == n+ 1 ){
22
+ res. add(sb. toString());
23
+ }
24
+ for (int i= 1 ; i<= n; i++ ){
25
+ if (! used[i]){
26
+ used[i] = true ;
27
+ sb. append(i);
28
+ backtrack(n, used, sb, step+ 1 );
29
+ sb. deleteCharAt(sb. length()- 1 );
30
+ used[i] = false ;
31
+ }
32
+ }
33
+ }
34
+ }
35
+ ```
36
+
37
+ ### 复杂度分析:
38
+
39
+ - 时间复杂度:$O(n!)$
40
+ - 空间复杂度:$O(n)$
41
+
42
+ ## #2 [ AC]
43
+
44
+ ### 算法
45
+
46
+ ``` java
47
+ public class Solution {
48
+ public String getPermutation (int n , int k ) {
49
+ StringBuilder sb = new StringBuilder ();
50
+ ArrayList<Integer > num = new ArrayList<Integer > ();
51
+ int fact = 1 ;
52
+ for (int i = 1 ; i <= n; i++ ) {
53
+ fact *= i;
54
+ num. add(i);
55
+ }
56
+ for (int i = 0 , l = k - 1 ; i < n; i++ ) {
57
+ fact /= (n - i);
58
+ int index = (l / fact);
59
+ sb. append(num. remove(index));
60
+ l -= index * fact;
61
+ }
62
+ return sb. toString();
63
+ }
64
+ }
65
+ ```
66
+
You can’t perform that action at this time.
0 commit comments