77. 组合

77. 组合

mid

给定两个整数 nk,返回范围 [1, n] 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案。

DFS 回溯

n 中选 k 个,经典的组合问题

https://markdown-1303167219.cos.ap-shanghai.myqcloud.com/image-20220708115434924.png

注意用 startIndex 避免重复

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
func combine(n int, k int) [][]int {
	res := make([][]int, 0)
	set := make([]int, 0)
	var dfs func(startIndex, layer int)
	dfs = func(startIndex, layer int) {
		if layer == k {
			res = append(res, append([]int{}, set...))
			return
		}
		for i := startIndex; i < n; i++ {
			set = append(set, i+1)
			dfs(i+1, layer+1)
			set = set[:len(set)-1]
		}
	}
	dfs(0, 0)
	return res
}

剪枝

来个剪枝,帅的一

如果当前能够提供的元素数量小于还需要的元素数量,那就剪去

https://markdown-1303167219.cos.ap-shanghai.myqcloud.com/image-20220708144016036.png

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
func combine(n int, k int) [][]int {
	res := make([][]int, 0)
	set := make([]int, 0)
	var dfs func(startIndex, layer int)
	dfs = func(startIndex, layer int) {
		if layer == k {
			res = append(res, append([]int{}, set...))
			return
		}
		if n-startIndex < k-len(set) {
			// 剪枝 如果当前能够提供的元素数量小于还需要的元素数量 那就剪去
			return
		}
		for i := startIndex; i < n; i++ {
			set = append(set, i+1)
			dfs(i+1, layer+1)
			set = set[:len(set)-1]
		}
	}
	dfs(0, 0)
	return res
}