算法7:搜索与回溯算法

1、回溯算法就是一种不断探索可能性的方法,去循环 每一种可能得到的结果,把符合条件的结果保留下来,是一种bfs算法。
2、回溯算法的模板:
void backtracking(参数) {
    if (终止条件) {//注意这里的条件是根据叶子节点的条件来写的
        存放结果;
        return;
    }

    for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
        处理节点;//这个是根据路程中的节点来写的
        backtracking(路径,选择列表); // 递归
        回溯,撤销处理结果
    }
}

 

3、回溯的解法:
  • 首先是大概在心里明白这题目是使用的回溯算法,其次是心中牢记回溯的模板
  • 画出该题目需要使用的多叉树的模型,按照横向是for循环,纵向是dfs()函数的图来画:

 

 

4、回溯算法的典型例子:全排列
力扣46道题目:https://leetcode.cn/problems/permutations/,里面有我的解题过程,可以看看
 
5、这个是最重要的一点,也就是在for循环内部dfs传递的参数,是i还是u是有区别的,当需要的是一个重复的元素集合的时候使用的是u,使用i得到的效果是[2,2,3],那么使用u得到的结果就是[2,2,3],[2,3,2],[3,2,2].所以是一个很重要的问题,目前使用模板还不是很熟悉,但是这一点会帮助你更好的理解画出树的形状之后更好的去理解回溯算法。
6、续上5所诉的,卡哥的总结是这样的:我举过例子,如果是一个集合来求组合的话,就需要startIndex,例如:77.组合 (opens new window)216.组合总和III (opens new window)
如果是多个集合取组合,各个集合之间相互不影响,那么就不用startIndex,例如:17.电话号码的字母组合
 
 
posted @ 2022-09-04 09:29  铜锣湾陈昊男  阅读(9)  评论(0)    收藏  举报