题目:

  1. 有一个二维矩阵 grid ,每个位置要么是陆地(记号为 0 )要么是水域(记号为 1 )。
  2. 我们从一块陆地出发,每次可以往上下左右 4 个方向相邻区域走,能走到的所有陆地区域,我们将其称为一座「岛屿」。
  3. 如果一座岛屿 完全 由水域包围,即陆地边缘上下左右所有相邻区域都是水域,那么我们将其称为 「封闭岛屿」。
  4. 请返回封闭岛屿的数目。
  5. 来源:力扣(LeetCode
  6. 链接:https://leetcode-cn.com/problems/number-of-closed-islands
  7. 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

答案:

时间:

10min,手打了unionfind

  1. class Unionfind:
  2. def __init__(self,n):
  3. self.parent = [i for i in range(n)]
  4. self.rank = [1 for _ in range(n)]
  5. self.count = n
  6. def find(self,p):
  7. while self.parent[p] != self.parent[self.parent[p]]:
  8. self.parent[p] = self.parent[self.parent[p]]
  9. return self.parent[p]
  10. def getunion(self,p,q):
  11. i = self.find(p)
  12. j = self.find(q)
  13. if i == j:
  14. return
  15. if self.rank [i] < self.rank [j]:
  16. self.parent[i] = j
  17. self.rank [j] += self.rank [i]
  18. else:
  19. self.parent[j] = i
  20. self.rank [i] += self.rank [j]
  21. self.count -= 1
  22. class Solution:
  23. def closedIsland(self, grid: List[List[int]]) -> int:
  24. if not grid or not grid[0]:return 0
  25. m,n=len(grid),len(grid[0])
  26. directs=[(1,0),(-1,0),(0,1),(0,-1)]
  27. union=Unionfind(m*n+1)
  28. for i in range(m):
  29. for j in range(n):
  30. pos= i*n+j
  31. if i==0 or i==m-1 or j==0 or j==n-1:
  32. union.getunion(pos,n*m)
  33. continue
  34. if grid[i][j]==1:
  35. union.getunion(pos,n*m)
  36. if grid[i][j]==0:
  37. for ix,iy in directs:
  38. new_i,new_j = i+ix,j+iy
  39. new_pos =new_i*n+new_j
  40. if grid[new_i][new_j]==0:
  41. union.getunion(pos,new_pos)
  42. return union.count-1

要点:

1. 做出并查集

2. 确定要合并的类即可。

其他:

代码报错:无