题目:
有一个二维矩阵 grid ,每个位置要么是陆地(记号为 0 )要么是水域(记号为 1 )。
我们从一块陆地出发,每次可以往上下左右 4 个方向相邻区域走,能走到的所有陆地区域,我们将其称为一座「岛屿」。
如果一座岛屿 完全 由水域包围,即陆地边缘上下左右所有相邻区域都是水域,那么我们将其称为 「封闭岛屿」。
请返回封闭岛屿的数目。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-closed-islands
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
答案:
时间:
10min,手打了unionfind
class Unionfind:
def __init__(self,n):
self.parent = [i for i in range(n)]
self.rank = [1 for _ in range(n)]
self.count = n
def find(self,p):
while self.parent[p] != self.parent[self.parent[p]]:
self.parent[p] = self.parent[self.parent[p]]
return self.parent[p]
def getunion(self,p,q):
i = self.find(p)
j = self.find(q)
if i == j:
return
if self.rank [i] < self.rank [j]:
self.parent[i] = j
self.rank [j] += self.rank [i]
else:
self.parent[j] = i
self.rank [i] += self.rank [j]
self.count -= 1
class Solution:
def closedIsland(self, grid: List[List[int]]) -> int:
if not grid or not grid[0]:return 0
m,n=len(grid),len(grid[0])
directs=[(1,0),(-1,0),(0,1),(0,-1)]
union=Unionfind(m*n+1)
for i in range(m):
for j in range(n):
pos= i*n+j
if i==0 or i==m-1 or j==0 or j==n-1:
union.getunion(pos,n*m)
continue
if grid[i][j]==1:
union.getunion(pos,n*m)
if grid[i][j]==0:
for ix,iy in directs:
new_i,new_j = i+ix,j+iy
new_pos =new_i*n+new_j
if grid[new_i][new_j]==0:
union.getunion(pos,new_pos)
return union.count-1