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/
