今日题目:
今日总结
回溯算法的入门。
回溯法,一般可以解决如下几种问题:
组合问题:N个数里面按一定规则找出k个数的集合
切割问题:一个字符串按一定规则有几种切割方式
子集问题:一个N个数的集合里有多少符合条件的子集
排列问题:N个数按一定规则全排列,有几种排列方式
棋盘问题:N皇后,解数独等等
本质上是暴力搜索各种可能的组合。一个关键点是如何进行剪枝。
回溯法解决的问题都可以抽象为树形结构,因为回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度,递归的深度,都构成的树的深度。
77. 组合
要点
1.回溯问题的模板
2. 注意下这里是如何剪枝的
代码:
var (
path []int
res [][]int
)
func combine(n int, k int) [][]int {
path, res = make([]int, 0, k), make([][]int, 0)
dfs(n, k, 1)
return res
}
func dfs(n int, k int, start int){
if len(path) == k{
temp := make([]int, k)
copy(temp, path)
res = append(res, temp)
return
}
for i := start; i <= n; i++ {
if n-i+1 < k-len(path){
break
}
path = append(path, i)
dfs(n, k, i+1)
path = path[:len(path)-1]
}
}