前言
本文旨在帮助小白熟悉DFS的基本流程和递归算法的理解,主要包括我们用回溯的思想对题目进行分析的过程,编写代码过程中递归函数语义以及参数的确定等一系列细节。
基本的概念
官方解释:一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n)。
其实说白了就跟咱们闯关游戏一样,遇到分岔路然后我们选一条路走到头结果发现不是终点,我们则需要重新返回到分岔路进行重新选择。
从上面我们可以提炼出来基本模板
result = []
def backtrack(路径, 选择列表):
if 满足结束条件:
result.add(路径)
return
for 选择 in 选择列表:
做选择
backtrack(路径, 选择列表)
撤销选择
路径:你已经选择的道路。
选择列表:岔路口可选择的道路。
做选择:在岔路口做道路的选择。
撤销操作:发现此路不通,返回最近的岔路口,选其它的道路。
代码模块不唯一,选择自己可以理解的即可,上面的代码模板主要借鉴labuladong的文章
下面咱们就以全排列、组合为