十五、图
1、基础知识
有向图、无向图
邻接表(适合稀疏数据)、邻接矩阵(稀疏不适合)
2、图的搜索
(1)广度优先
实现方法:
-
起始点进队列,节点cur设为访问过
-
节点cur取队列
-
添加cur的子节点(未被访问过),并且设为访问过
-
跳转至2,直至队列无节点
适合题型:保证最短路径
剑指 Offer II 107. 矩阵中的距离 (剑指 Offer II 107. 矩阵中的距离)Y
剑指 Offer II 108. 单词演变 (127. 单词接龙)单向+双向广度优先搜索 Y
126. 单词接龙 II(复杂)
(2)深度优先
实现方法:
-
访问起始点cur,设为访问过
-
访问起始点的子节点(未被访问过),递归
适合题型:找到符合条件的路径
建图(邻接表、邻接矩阵)+ DFS + 主函数
剑指 Offer II 110. 所有路径 (有向无环图)
class Solution {
public List<List<Integer>> allPathsSourceTarget(int[][] graph) {
List<List<Integer>> result = new LinkedList<>();
List<Integer> path = new LinkedList<Integer>();
dfs(0, graph, path, result);
return result;
}
private void dfs(int start, int[][] graph, List<Integer> path, List<List<Integer>> result) {
path.add(start);
if (start == graph.length - 1) {
result.add(new LinkedList<>(path));
} else {
for (int next : graph[start]) {
dfs(next, graph, path, result);
}
}
path.remove(path.size() - 1);
}
}
剑指 Offer II 111. 计算除法 (399. 除法求值)
(3)岛屿类(面积、个数、障碍)
面积(母题) 广度 (队列)+ 深度(栈)+深度(递归)
剑指 Offer II 105. 岛屿的最大面积 (695. 岛屿的最大面积)
数量 200. 岛屿数量
周长 463. 岛屿的周长
填色 733. 图像渲染
(4)图论的「双色问题」
递归dfs 或 队列bfs 剑指 Offer II 106. 二分图 785. 判断二分图 886. 可能的二分法
所需变量:colors[m],graph[m][...]
对每一个格子进行涂色+调用能否涂色递归函数
(5)拓扑排序
作用:判断图是否有环,先后顺序的事件执行顺序
基本要素:构件图、入度数组(哈希表)、队列、路径动态数组
BFS步骤:
-
添加所有入度为0的节点到队列中
-
while
-
出队列+写入路径
-
遍历邻居节点
-
邻居节点入度--
-
检查入度是否为0
-
入队列
-
-
-
-
-
返回值(排序的个数==原个数)
剑指 Offer II 113. 课程顺序 (210. 课程表 II)
207. 课程表 (判断是否有环)
310. 最小高度树 将同一层出度为1 的节点剪枝
剑指 Offer II 114. 外星文字典 HashMap HashSet
剑指 Offer II 115. 重建序列 超序列和子序列
(6)并查集
含义:用来表示不相交集合的数据,支持 合并 和 查找 两种操作,解决图的动态连接问题
步骤:
-
构建fathers数组或者哈希表
-
两两比较(合并判断及操作)
剑指 Offer II 117. 相似的字符串 839. 相似字符串组
2021.2.14 情人节 每日一题 765. 情侣牵手