题目:
有一个二维矩阵 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 = ndef 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:returnif self.rank [i] < self.rank [j]:self.parent[i] = jself.rank [j] += self.rank [i]else:self.parent[j] = iself.rank [i] += self.rank [j]self.count -= 1class Solution:def closedIsland(self, grid: List[List[int]]) -> int:if not grid or not grid[0]:return 0m,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+jif i==0 or i==m-1 or j==0 or j==n-1:union.getunion(pos,n*m)continueif 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+iynew_pos =new_i*n+new_jif grid[new_i][new_j]==0:union.getunion(pos,new_pos)return union.count-1
