Skip to content

Commit ef88754

Browse files
committed
排列: 第k个排列
Change-Id: Ibc4207f449fa3390c46dc201b201b2fd199cacec
1 parent 1595242 commit ef88754

File tree

1 file changed

+75
-0
lines changed

1 file changed

+75
-0
lines changed

go/leetcode/60.第k个排列.go

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
/*
2+
* @lc app=leetcode.cn id=60 lang=golang
3+
*
4+
* [60] 第k个排列
5+
*
6+
* https://leetcode-cn.com/problems/permutation-sequence/description/
7+
*
8+
* algorithms
9+
* Medium (46.71%)
10+
* Likes: 123
11+
* Dislikes: 0
12+
* Total Accepted: 14.3K
13+
* Total Submissions: 30.4K
14+
* Testcase Example: '3\n3'
15+
*
16+
* 给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。
17+
*
18+
* 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:
19+
*
20+
*
21+
* "123"
22+
* "132"
23+
* "213"
24+
* "231"
25+
* "312"
26+
* "321"
27+
*
28+
*
29+
* 给定 n 和 k,返回第 k 个排列。
30+
*
31+
* 说明:
32+
*
33+
*
34+
* 给定 n 的范围是 [1, 9]。
35+
* 给定 k 的范围是[1,  n!]。
36+
*
37+
*
38+
* 示例 1:
39+
*
40+
* 输入: n = 3, k = 3
41+
* 输出: "213"
42+
*
43+
*
44+
* 示例 2:
45+
*
46+
* 输入: n = 4, k = 9
47+
* 输出: "2314"
48+
*
49+
*
50+
*/
51+
func getPermutation(n int, k int) string {
52+
// 1234 1243 1324 1342 1423 1432
53+
// 第n位固定、其他位的取值有(n-1)!种
54+
nums := []byte("123456789")
55+
c := make([]int, n)
56+
c[0] = 1
57+
// 预先算好阶乘
58+
for i := 1; i < n; i++ {
59+
c[i] = c[i-1] * i
60+
}
61+
ret := ""
62+
k-- // 序号从0开始
63+
for i := n-1; i >= 0; i-- {
64+
j := k / c[i] // 8/6 2/2
65+
ret += string(nums[j]) // 2 3
66+
if j + 1 < len(nums) { // 134
67+
nums = append(nums[:j], nums[j+1: ]...)
68+
} else {
69+
nums = nums[:j]
70+
}
71+
k %= c[i] // 2
72+
}
73+
return ret
74+
}
75+

0 commit comments

Comments
 (0)