目录
1. dfs和bfs区别,解决不同的问题
- 通常来说,BFS适用于求最短路径,DFS用来解决最长匹配、连通性这些问题比较方便
【例1】
1091. 二进制矩阵中的最短路径
链接1:https://leetcode.cn/problems/shortest-path-in-binary-matrix/solution/java-dfs-tle-bfs-by-zhushiyi-c055/
解题思路1
首先本题规定了遍历的起点和终点,因此不需要套两层循环直接从 [0,0] 开始遍历到 [row-1][col-1] 即可。
对于寻找最短路径或者任何需要扫描全图的情况,BFS 可以理解为二叉树的层序遍历,对于本题这样的固定起点问题,可以利用 marked 标记数组在遍历的同时进行剪枝。
最短路径中的点向右下角方向上的相邻节点一定不会被标记过,换句话说,如果在入队的时候发现当前节点向右下的 前方 节点已经被访问过了,那么当前节点必然会比之前路径多 1,也就肯定不在最短的路径上,此时就可以直接忽略,继续访问队列中剩下的节点。
解题思路2
典型的BFS最短路径问题,用DFS也可以求解,但是容易超时。
在二维矩阵中搜索,什么时候用BFS,什么时候用DFS?
1.如果只是要找到某一个结果是否存在,那么DFS会更高效。因为DFS会首先把一种可能的情况尝试到底,才会回溯去尝试下一种情况,只要找到一种情况,就可以返回了。但是BFS必须所有可能的情况同时尝试,在找到一种满足条件的结果的同时,也尝试了很多不必要的路径;
2.如果是要找所有可能结果中最短的,那么BFS会更高效。因为DFS是一种一种的尝试,在把所有可能情况尝试完之前,无法确定哪个是最短,所以DFS必须把所有情况都找一遍,才能确定最终答案(DFS的优化就是剪枝,不剪枝很容易超时)。而BFS从一开始就是尝试所有情况,所以只要找到第一个达到的那个点,那就是最短的路径,可以直接返回了,其他情况都可以省略了,所以这种情况下,BFS更高效。
BFS解法中的visited为什么可以全局使用?
BFS是在尝试所有的可能路径,哪个最快到达终点,哪个就是最短。那么每一条路径走过的路不同,visited(也就是这条路径上走过的点)也应该不同,那么为什么visited可以全局使用呢?
因为我们要找的是最短路径,那么如果在此之前某个点已经在visited中,也就是说有其他路径在小于或等于当前步数的情况下,到达过这个点,证明到达这个点的最短路径已经被找到。那么显然这个点没必要再尝试了,因为即便去尝试了,最终的结果也不会是最短路径了,所以直接放弃这个点即可。
2. bfs
- K 站中转内最便宜的航班
- 颜色交替的最短路径 有向图
- 对称二叉树 bfs/dfs
- 二叉树的层序遍历 bfs入门题
- 二进制矩阵中的最短路径 bfs
- 打开转盘锁 bfs
- 省份数量 dfs/bfs/并查集
- 颜色交替的最短路径
TODO: 有向图 - 对称二叉树
bfs,迭代方法:
3. dfs
- 电话号码的字母组合 dfs+回溯
- 括号生成 dfs+回溯
- 二进制手表 回溯+hash去重