dfs算法总结

Posted sunshine1218

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dfs算法总结相关的知识,希望对你有一定的参考价值。

DFS 深度优先搜索

主要有两种实现方法:栈和递归

什么是DFS?说白了就是一直遍历元素的方式而已,我们可以把它看成是一条小蛇,在每个分叉路口随意选择一条路线走,直到撞到南墙,才会调头返回到上一个分叉路口,走另外一条路,有时候运气很好,撞到了目标点,那么这个算法就结束了。

模板:

 参数1 DFS(参数2)
{
     if(返回条件成立) return 参数 ;
    DFS(进行下一步的搜索遍历) ;
回朔;
}

1)if 语句:

作用就是告诉小蛇:是否撞到南墙啦?撞到就返回啦,或者,是否到达终点啦?到了就结束啦!

所以使用DFS解决问题的时候需要思考这两个问题:是否有条件不成立的信息(撞到南墙),是否有条件成立的信息(到达终点)。

还有一个非常重要的信息:是否需要标记访问节点。

2)作标记

是为了防止重复访问,出现环回

技术图片

 如何标记一个节点是否访问过呢?标记常用方法有数组法和set 

bool visited[length] ; //数组表示,每访问过一个节点,数组将对应元素置为true
Set<类型> set; //建立set,每访问一个节点,将该节点加入到set中去

也可以在原数组上进行标记,具体题目具体分析

3)回朔

这点不能忽略,回退到上一节点,继续向下搜索

 总之使用dfs需要考虑三点:

a,是否有条件不成立的信息(撞南墙)

b,是否有条件成立的信息(到终点)

c,是否需要记录节点(记轨迹)

3)啥时候使用dfs呢 

当我们遇到的问题与路径相关,且不是寻找最短路径(最短路径为BFS,下次再说),或者需要遍历一个集合中的所有元素,或者是查找某一种问题的全部情况时,我们可以考虑使用DFS来求解。

LeetCode常见题目如下:

1、求1到n的全排列

参考博客:https://blog.csdn.net/li_jeremy/article/details/83714298

 2、岛屿数量

3、岛屿的最大面积

4、

以上是关于dfs算法总结的主要内容,如果未能解决你的问题,请参考以下文章

深度优先算法--对DFS的一些小小的总结

算法笔记 DFS的千层套路 HERODING的算法之路

[Leetcode算法学习]:Leetcode模块Queue & Stack部分总结

总结了一些算法二叉树操作的干货 (附Python代码)

leetcode之最短路径+记忆化dfs+bfs+动态规划刷题总结

周总结(2017.2.16):第一周算法学习。