leetcode-200 islands
题意:
给出一个二维数组,只包含 1/0 。1表示陆地,0表示水,求岛屿个数。例:
input:
1 1 0 0 0
1 1 0 0 0
0 0 1 0 0
0 0 0 1 1
复制代码
output:
3
思路
- 染色法
- 遍历数组
- 如果为1,则找到相邻的所有为1的节点,赋值为0,同时count++
2可以用DFS和BFS实现。
以下代码会对更改源数组,推荐用visited[]。
DFS:每个节点都判断附近有没为1的节点,伪代码如下:
function DFS(x, y)
if (int[x][y] := 1){
int[x][y] := 0
DFS(x, y+1)
DFS(x, y-1)
DFS(x+1, y)
DFS(x-1, y)
}
复制代码
BFS:将所有附近为1的节点都放到queue中,再逐个清理
function BFS(x, y)
q.offer(x, y)
while (!q.isEmpty){
(i, j) := q.poll()
int(i, j) := 0
if int[i+1][j] := 1 q.offer(i+1, j)
if int[i-1][j] := 1 q.offer(i-1, j)
if int[i][j+1] := 1 q.offer(i, j+1)
if int[i][j-1] := 1 q.offer(i, j-1)
}
复制代码
- 并查集
- 初始化“1”的节点的root为自己
- 遍历所有节点,相邻合并(只做统计这里可以)
- 遍历parent,获取详情
leetcode-547 Friend Circle
题意
给定一个二维矩阵(权图),1表示认识,0表示不认识,求有多少朋友圈。例:
A B C
A 1 1 0
B 1 1 0
C 0 0 1
复制代码
思路
这题和leetcode-200其实是一样的,如果有连续相连的“1”,说明这些人互相认识,也就是一个朋友圈,求朋友圈个数也是求有多少个岛屿;也是典型的图的边的矩阵表示方式。
leetcode-200、547直接用并查集方法即可,详见并查集-理论
欢迎关注微信公众号,提供思想和技术类原创文章。微信搜索小兵张健或扫描以下二维码。