第一题 130. Surrounded Regions
题目描述
将所有被环绕的’O’变为‘X’,被环绕的定义是,所有相邻的’O’周围不靠近边界
算法
利用DFS对所有从边界开始的’O’进行探测,找出所有不环绕的’O’
|
|
第二题 200. Number of Islands
题目描述
给定一个由字符‘1’(陆地)和‘0’(水域)组成的二维网格地图,计算岛屿的个数。岛屿被水域环绕,由竖直或者水平方向邻接的陆地构成。你可以假设网格地图的四条边都被水域包围。
测试样例见题目描述。
算法
与上题相似,DFS
|
|
第三题 305. Number of Islands II
题目描述
现在给定一个m * n的二维矩阵,和一系列的操作。具体操作是将一片海域变为陆地,并统计在每次操作后,岛屿的数量
算法
利用数组来代表一个树,points[newOperation] = ?如果是新的岛屿,那么树的根就是自己。如果不是新的岛屿,那么就让现在的point[newOperation] = FirstAddPosition,这样可以非常快速的检查每次加入的岛屿是否属于之前加入的岛屿中。比每次加入后做深度遍历要快很多
|
|
第四题 261. Graph Valid Tree
题目描述
给定n个节点,以及他们之间边的关系(无向),问是否这些节点能够组成一棵树
算法
利用Union and Find 进行求解,将所有已经在一起的节点归并到一个Set中。然后用find查看新进来的节点是否会形成图
|
|
第五题 323. Number of Connected Components in an Undirected Graph
题目描述
对于n个节点,我们有任意条无向的边缘,求整个图中有几个独立不联通的区域
算法
|
|
压缩路径后
|
|
第六题 547. Friend Circles
题目描述
给定邻接矩阵M,求连通分量的个数。
注意:
- N的范围[1, 200]
- M[i][i] = 1
- 如果M[i][j] = 1,那么M[j][i] = 1
算法
依然用Union Find的办法
|
|
第八题 207. Course Schedule
题目描述
一共有n门需要选择的课程,标号为0到n-1。
有些课程可能会有先修课程,例如想要选择课程0,必须首先选过课程1,可以表述为配对:[0,1]
给定课程总数和一组先修课程配对,判断是否可以修完所有的课程。
例如:
2, [[1,0]]
一共有2门备选课程。要选择课程1,必须先完成课程0。因此这是可能的。
2, [[1,0],[0,1]]
一共有2门备选课程。要选择课程1,必须先完成课程0,而要修课程0,必须修完课程1。因此这是不可能的。
算法
利用拓扑排序解决这个问题
简而言之拓扑排序有三步
- 找寻入度为0的节点
- 将这个节点所有的向外的连线都删除
- 如果没有这样的节点,则返回,如果有则返回1循环
- 最后查看图中是否有剩余的入度不为0的节点
|
|
第九题 210. Course Schedule II
题目描述
一共有n门需要选择的课程,标号为0到n-1。
有些课程可能会有先修课程,例如想要选择课程0,必须首先选过课程1,可以表述为配对:[0,1]
给定课程总数和一组先修课程配对,返回可以完成所有课程的选课顺序。
可能有多个正确的顺序,只需要任选其一即可。如果不可能完成所有的课程,返回一个空数组。
例如:
2, [[1,0]]
一共有2门备选课程。要选择课程1,必须先完成课程0。因此正确的课程顺序是[0,1]。
4, [[1,0],[2,0],[3,1],[3,2]]
一共有4门备选课程。要选择课程3,必须先完成课程1和2。而课程1和2都需要先修完课程0才能选。因此一种正确的课程顺序是[0,1,2,3]。另一个正确的顺序是[0,2,1,3]。
算法
仍然与前面的一题一样
|
|