funcnumIslands(grid [][]byte)int{
n :=len(grid)if n ==0{return0}
m :=len(grid[0])
uf :=ConstructorUF(m * n)
tmp :=[4][2]int{{0,1},{0,-1},{-1,0},{1,0}}var ret, nr, nc intfor i :=0; i < n; i++{for j :=0; j < m; j++{if grid[i][j]=='1'{for_, d :=range tmp {
nr, nc = i+d[0], j+d[1]// 周边节点都和当前点是一个老大if nr >=0&& nc >=0&& nr < n && nc < m && grid[nr][nc]=='1'{
uf.union(i*m+j, nr*m+nc)}}}}}// 求老大数量,即自己的老大是自己for i :=0; i < n; i++{for j :=0; j < m; j++{if grid[i][j]=='1'{if i*m+j == uf.findRoot(i*m+j){
ret++}}}}return ret
}
深度优先搜索(染色)解法
funcnumIslands(grid [][]byte)int{
n :=len(grid)if n ==0{return0}
m :=len(grid[0])var ret intfor i :=0; i < n; i++{for j :=0; j < m; j++{if grid[i][j]=='1'{
ret++// 染色之后,如果再遇到没染色的,则是新岛屿dfs(i, j, n, m, grid)}}}return ret
}funcdfs(x, y, n, m int, g [][]byte){if x <0|| x > n-1|| y <0|| y > m-1{return}if g[x][y]=='1'{
g[x][y]='0'// 判断四周dfs(x-1, y, n, m, g)dfs(x+1, y, n, m, g)dfs(x, y-1, n, m, g)dfs(x, y+1, n, m, g)}}
广度优先搜索
funcnumIslands(grid [][]byte)int{
n :=len(grid)if n ==0{return0}
m :=len(grid[0])var ret, x, y intvar queue []int
tmp :=[4][2]int{{0,1},{0,-1},{1,0},{-1,0}}for i :=0; i < n; i++{for j :=0; j < m; j++{if grid[i][j]=='1'{
grid[x][y]='0'
ret++
queue =append(queue, i*m+j)forlen(queue)>0{// 出队
x, y = queue[0]/m, queue[0]%m
queue = queue[1:]// 向四周扩散for_,d:=range tmp {
xx, yy := x+d[0], y+d[1]if xx >=0&& xx <= n-1&& yy >=0&& yy <= m-1&& grid[xx][yy]=='1'{// 关键!不加下一行会引起很多重复便利,导致内存溢出
grid[xx][yy]='0'
queue =append(queue, xx*m+yy)}}}}}}return ret
}
funcfindCircleNum(M [][]int)int{
n :=len(M)var ret int
uf :=ConstructorUF(n * n)for i :=0; i < n; i++{for j :=0; j < n; j++{// 当前值是1,则将对角线上的值连接if M[i][j]==1{
uf.union(i*n+j,i*n+i)
uf.union(i*n+j,j*n+j)}}}for i :=0; i < n; i++{for j :=0; j < n; j++{if M[i][j]==1&& i*n+j == uf.findRoot(i*n+j){
ret++}}}return ret
}
深度优先搜索
funcfindCircleNum(M [][]int)int{
n :=len(M)var ret intfor i :=0; i < n; i++{for j :=0; j < n; j++{if M[i][j]==1{
ret++dfs(i,n,M)}}}return ret
}funcdfs(x, n int, M [][]int){for i :=0; i < n; i++{// 对于每一个是1的点,将它所属行和所属列的点全部染色if M[x][i]==1{
M[x][i]=0
M[i][x]=0dfs(i, n, M)}}}
广度优先搜索
funcfindCircleNum(M [][]int)int{
n :=len(M)var ret, x intvar queue []intfor i :=0; i < n; i++{for j :=0; j < n; j++{if M[i][j]==1{
ret++
M[j][i]=0
M[i][j]=0
queue =append(queue, i)forlen(queue)!=0{
x = queue[0]
queue = queue[1:]for a :=0; a < n; a++{if M[x][a]==1{
M[x][a]=0
M[a][x]=0
queue =append(queue, a)}}}}}}return ret
}