回溯算法
- 回溯算法主要解决的问题
- 按一定规律组合问题
- 按一定规律的排列问题
- 按一定规律分割,如分割为回文字符串、IP地址还原(注意path中存放符合要求的切割子集)等
- N皇后问题
- 数独问题
- 回溯算法的本质
回溯算法主要是为了解决for嵌套,当暴力解法需要多层for嵌套时,如50层for循环,此时需要使用回溯解决;
回溯的对象可以归类为N叉树,一层for循环遍历宽度,之后递归遍历深度 - 回溯算法模板
func xxx (参数) { if (终止条件) { xxx return } for 遍历宽度 { xx func_name(参数) // 递归 xxx // 回溯 } }
组合问题
- tip: 需要用到startIndex,当集合中元素不可重复时,递归传参index+1,参考用例:组合III;当其可重复时,递归传参为index,参考用例:组合,可重复选取
- 当数组中存在重复元素,但是每个元素只能使用一次时,需要在树层间去重,树枝可以存在重复元素,参考用例:组合II
组合III
func CombinationI(n, k int) [][]int {
var res [][]int
var path []i