搜索
- 搜索就是采用
直接遍历整个状态空间
的方式寻找答案的一类算法。 - 根据遍历状态空间(图)方式的不同,可分为:
- 深度优先搜索(DFS)
- 适合树形状态空间,因为递归本身就会产生树的结构,可以用一个全局变量维护状态中较为复杂的信息。
- 不需要队列,节省空间。
- 广度优先搜索(BFS)
- 适合求 “最小代价”、“最小步数” 的题目。
- BFS 是按层次序搜索,第 k 步搜完才会搜第 k + 1 步,在任意时刻队列中至多只有两层。
- 深度优先搜索(DFS)
- 状态空间为有向无环图,使用 BFS 拓扑排序 / DFS 记忆化搜索均可。
- 一般来说,每个状态只遍历
一次
,所以当状态空间是 “图” 而不是 “树” 时,要判重
。 - 解题步骤
- 纸上模拟,提取信息
- 定义状态
- 确定遍历顺序(DFS、BFS)
- 定义搜索框架
- 如果是 DFS,状态作为参数,确定递归边界,注意还原现场
- 如果是 BFS,状态用队列保存
- 考虑是否需要判重
- 程序实现
LeetCode 练习题
- 17. 电话号码的字母组合
- 51. N 皇后
- 200. 岛屿数量
- 130. 被围绕的区域
- 433. 最小基因变化
- 329. 矩阵中的最长递增路径