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求出所有可行路径