1020. 飞地的数量
飞地的数量
题目描述:
给你一个大小为 m x n 的二进制矩阵 grid ,其中 0 表示一个海洋单元格、1 表示一个陆地单元格。
一次 移动 是指从一个陆地单元格走到另一个相邻(上、下、左、右)的陆地单元格或跨过 grid 的边界。
返回网格中 无法 在任意次数的移动中离开网格边界的陆地单元格的数量。
示例 1:
输入:grid = [[0,0,0,0],[1,0,1,0],[0,1,1,0],[0,0,0,0]]
输出:3
解释:有三个 1 被 0 包围。一个 1 没有被包围,因为它在边界上。
示例 2:
输入:grid = [[0,1,1,0],[0,0,1,0],[0,0,1,0],[0,0,0,0]]
输出:0
解释:所有 1 都在边界上或可以到达边界。
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 500
grid[i][j] 的值为 0 或 1
思路:
Dfs 题,遍历周边的,然后遍历中间的数有几个岛屿
代码:
func numEnclaves(grid [][]int) int {
var dirs = []struct{ x, y int }{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}
var count int
m, n := len(grid), len(grid[0])
vis := make([][]bool, m)
for i := range vis {
vis[i] = make([]bool, n)
}
var dfs func(int, int,bool)
dfs = func(r, c int , flag bool) {
if r < 0 || r >= m || c < 0 || c >= n || grid[r][c] == 0 || vis[r][c] {
return
}
vis[r][c] = true
if flag{
count++
}
for _, d := range dirs {
dfs(r+d.x, c+d.y,flag)
}
}
for i:=0;i<n;i++{
if grid[0][i] == 1 && vis[0][i] == false{
dfs(0,i,false)
}
if grid[m-1][i] == 1 && vis[m-1][i] == false{
dfs(m-1,i,false)
}
}
for i:=1;i<m-1;i++{
if grid[i][0] == 1 && vis[i][0] == false{
dfs(i,0,false)
}
if grid[i][n-1] == 1 && vis[i][n-1] == false{
dfs(i,n-1,false)
}
}
for i:=1;i<m-1;i++{
for j:=1;j<n-1;j++{
if grid[i][j] == 1 && vis[i][j] == false{
dfs(i,j,true)
}
}
}
return count
}
代码效率:
执行用时:60 ms, 在所有 Go 提交中击败了35.64%的用户
内存消耗:6.8 MB, 在所有 Go 提交中击败了75.25%的用户
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!