graph
dfs
bfs
1.clone graph
2.copy list with random pointer
3.topological sorting
4.permutations
5.subsets
6.n queens
7.subsetsII
8.palindrome partitioning
9.combination sum
10.combination sumII
11.word ladder
12.word ladderII
克隆图:先克隆点,再克隆边。
宽度优先搜索有模板,以后告诉了图中的一个点,遍历整张图先想到宽度优先搜索
宽度优先搜索一般有个队列
哈希表
一张图一般不会给你整张图,一般给你的是图中的某一个节点
拓扑排序: 度、入度、出度
每次遍历入度为0的点。去掉入度为0点的边,再遍历剩下的图的入度为0的点
本质上还是一个遍历图的问题
用宽度优先搜索,用dfs时间复杂度大
如果多个点入度为0,随便从哪个点开始排都可以,所以可能同一个图出现多个拓扑排序的结果
图的题主要掌握宽度优先搜索
图和树的宽度优先搜索的对比:都使用队列
树是循环左子树和右子树,图是循环整个相邻的点
有些图的遍历用hash表示这个节点有没有被遍历过
permutations:搜索问题的模板问题
找所有情况的问题想到用dfs,一般只有dfs才能搜索完所有的情况
dfs搜索树
所有的叶子节点相当于permutations问题的可行解
按照搜索树的思想去实现,每个叶子节点其实就是permutations问题的答案
写代码的时候,按照搜索树的思想去模拟搜索的过程就可以
需要回溯到本层,所以需要删除
递归的方法
permutations求所有的排列情况,subsets求所有的子集
subsets:求子集问题也是另一类模板题
去返回所有解,所有可行性的时候,考虑dfs
想到dfs,就需要构建深度优先搜索树
子集不分顺序
之前选择的元素,下一次就不再选择
这个深度优先搜索树,每个节点都是解
每次遍历是从position向后遍历
permutations:
时间复杂度:O(n!)
subsets:
时间复杂度: O(2的n次方)
n queens:一碰到求所有可行性的题,就想到用dfs的方式
转换为permutations问题,不一样的地方在于:每次按照permutations问题放置皇后之后,再写一个check函数,检查在列和对角线上是否有冲突
permutations变形上加了check函数
时间复杂度:O(n!)
subsetsII:需要排序。想把相同的元素排在一起,这样就可以考虑重复的情况。
palindrome partitioning:
与subsets类似,因为subsets也是针对每个值选与不选
时间复杂度:O(2的n-1次方),实际就是 O(2的n次方)
combination sum、combination sumII:求所有满足条件的子集
word ladder:简单图最短路的问题
不可以使用dfs
先用bfs求每个节点到起始节点的距离,然后使用dfs求出所有可行路径