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/

12、 https://leetcode-cn.com/problems/partition-to-k-equal-sum-subsets/submissions/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM