• 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、黄金矿工

    5、单词搜索

    6、全排列

    7、无重复字符串的排列组合

    8、被围绕的区域

    9、路径总和||

    10、组合总和 、组合总和|| 、组合总和|||

    11、组合 https://leetcode-cn.com/problems/combinations/submissions/

  • 相关阅读:
    hdu1242 Rescue BFS广搜 + 优先队列
    hdu 1430 魔板
    康托展开
    hdu 4394 Digital Square(bfs)
    hdu 1969 Pie
    KMP模板
    hdu 1846 Brave Game
    循环赛日程表
    hdu 1022 Train Problem I
    整数划分问题
  • 原文地址:https://www.cnblogs.com/sunshine1218/p/12081588.html
Copyright © 2020-2023  润新知