DFS核心代码:
参考:https://blog.csdn.net/qq_40763929/article/details/81629800
关于dfs参数问题,什么在变化,就把什么设置成参数。
如果要求输出所有可能的解,往往都是要用深度优先搜索。
如果是要求找出最优的解,或者解的数量,往往可以使用动态规划。
1 | void dfs()//参数用来表示状态 |
全排列问题
先给一个正整数 ( 1 < = n < = 10 )
例如n=3,所有组合,并且按字典序输出:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
1 |
|
组合问题
Given array nums = [-1, 0, 1, 2, -1, -4],
A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]
1 | void threeSumCore(set<vector<int>> &res, vector<int> &cur, vector<int> &nums, vector<int>::iterator p,int dep){ |
LeetCode 17. Letter Combinations of a Phone Number
1 | Input: "23" |
1 | void letterCombinationsDfs(map<char, string> &mp, const string &digits, vector<string> &res, string cur, int dep){ |
回文字符串问题
类似全排列,亦是for 1:len展开所有
1 |
|
N皇后问题:
题目链接:http://codeup.cn/problem.php?cid=100000608&pid=3
1 | bool canPut(int rows, int cols, vector<string> cur, int n){ |
LeetCode:surrounded-regions
题目链接:<https://leetcode.com/problems/surrounded-regions/
思路:
- 遍历四条边上的O,并深度遍历与其相连的O,将这些O都转为1
- 1代表没被包围,再将这些1都变为O
1 | X X X X X X X X X X X X |
1 | void surrounded_regions(int rows, int cols, vector<vector<char>> &board){ |
BFS:
最典型的模版就是树的层序遍历:
1 | void levelOrder(TreeNode* root){ |
矩阵中的路径问题:
1 | int h[606][606]; |
广搜或深搜可分为两大类题型:
1 . 地图型:这种题型将地图输入,要求完成一定的任务。因为地图的存在。使得题意清楚形象化,容易理清搜索思路。
2 . 数据型:这种题型没有给定地图,一般是一串数字或字母,要求按照一定的任务解题。相对于地图型,这种题型较为抽象,需要在数据中进行搜索。数据以数组的形式存储,那么只要将数组也当作一张图来进行搜索就可以了。
PS:二维数组的题目即地图型
N小于20的,适用DFS。
而一般 N<= 200,N<=1000这种
一定不可能用DFS去做
而且并不只是整个题目不能用DFS,其中的每一步也不能使用DFS
BFS和DFS对比
- DFS多用于连通性问题因为其运行思想与人脑的思维很相似,故解决连通性问题更自然。
- BFS多用于解决最短路问题,其运行过程中需要储存每一层的信息,所以其运行时需要储存的信息量较大,如果人脑也可储存大量信息的话,理论上人脑也可运行BFS。
多数情况运行BFS所需的内存会大于DFS需要的内存(DFS一次访问一条路,BFS一次访问多条路)。
1 |
|