Skip to content

Commit d432798

Browse files
committed
组合排列: 全排列
Change-Id: I9df53cce6b2f82cabf728eec48744196bef2617f
1 parent fc4844a commit d432798

File tree

1 file changed

+59
-0
lines changed

1 file changed

+59
-0
lines changed

Diff for: go/leetcode/46.全排列.go

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/*
2+
* @lc app=leetcode.cn id=46 lang=golang
3+
*
4+
* [46] 全排列
5+
*
6+
* https://leetcode-cn.com/problems/permutations/description/
7+
*
8+
* algorithms
9+
* Medium (71.53%)
10+
* Likes: 365
11+
* Dislikes: 0
12+
* Total Accepted: 43.4K
13+
* Total Submissions: 60.7K
14+
* Testcase Example: '[1,2,3]'
15+
*
16+
* 给定一个没有重复数字的序列,返回其所有可能的全排列。
17+
*
18+
* 示例:
19+
*
20+
* 输入: [1,2,3]
21+
* 输出:
22+
* [
23+
* ⁠ [1,2,3],
24+
* ⁠ [1,3,2],
25+
* ⁠ [2,1,3],
26+
* ⁠ [2,3,1],
27+
* ⁠ [3,1,2],
28+
* ⁠ [3,2,1]
29+
* ]
30+
*
31+
*/
32+
33+
34+
func permute(nums []int) [][]int {
35+
visited := make([]bool, len(nums))
36+
out := []int{}
37+
res := [][]int{}
38+
permuteDFS(&nums, 0, &visited, &out, &res)
39+
return res
40+
}
41+
42+
// 深度优先递归,通过访问标记数组去重
43+
func permuteDFS(nums *[]int, level int, visited *[]bool, out *[]int, res *[][]int) {
44+
if level == len(*nums) {
45+
*res = append(*res, append([]int{}, (*out)...)) // 复制值
46+
return
47+
}
48+
for i := 0; i < len(*nums); i++ {
49+
if (*visited)[i] {
50+
continue
51+
}
52+
(*visited)[i] = true
53+
*out = append(*out, (*nums)[i])
54+
permuteDFS(nums, level+1, visited, out, res)
55+
*out = (*out)[:len(*out)-1]
56+
(*visited)[i] = false
57+
}
58+
}
59+

0 commit comments

Comments
 (0)