Python程序:查找更改一个水单元格为陆地单元格后的最大岛屿


假设我们有一个二进制矩阵,其中 1 代表陆地,0 代表水。岛屿是一组被水包围的 1。我们必须找到最大岛屿的大小。我们最多可以将一个水单元格更改为陆地单元格。

因此,如果输入类似于

101
000
110
111

则输出将为 7,因为我们可以将一个水单元格转换为陆地以连接这两个岛屿。因此,最终矩阵如下所示:−

101
000
110
111

为了解决这个问题,我们将遵循以下步骤:−

  • R := mat 的行数,C := mat 的列数

  • mass := 一个新的映射

  • id := 555

  • 定义一个函数 floodfill()。这将采用 r、c、id

  • 如果 r 和 c 在矩阵范围内并且 mat[r, c] 为 1,则

    • mat[r, c] := id

    • mass[id] := mass[id] + 1

    • 对于 [(r + 1, c) ,(r − 1, c) ,(r, c + 1) ,(r, c − 1) ] 中的每一对 (r2, c2),执行以下操作:

      • floodfill(r2, c2, id)

  • 从主方法执行以下操作:−

  • 对于从 0 到 R 的范围内的 r,执行以下操作:

    • 对于从 0 到 C 的范围内的 c,执行以下操作:

      • 如果 mat[r, c] 等于 1,则

        • id := id + 1

        • mass[id] := 0

        • floodfill(r, c, id)

  • ans := (所有 mass 值和 1) 中的最大值

  • 对于从 0 到 R − 1 的范围内的 r,执行以下操作:

    • 对于从 0 到 C − 1 的范围内的 c,执行以下操作:

      • 如果 mat[r, c] 不等于 0,则

        • 转到下一次迭代

      • island_set := 一个新的集合

      • 对于 [(r + 1, c) ,(r − 1, c) ,(r, c + 1) ,(r, c − 1) ] 中的每一对 (r2, c2),执行以下操作:

        • 如果 r2 和 c2 在 mat 的范围内并且 mat[r2, c2] 为 1,则

          • 将 mat[r2, c2] 添加到 island_set 中

        • ans := ans 和 (1 + 每个岛屿在 island_set 中的每个 mass[island] 的总和) 中的最大值

  • 返回 ans

让我们查看以下实现以更好地理解:−

示例

 实时演示

class Solution:
   def solve(self, mat):
      R, C = len(mat), len(mat[0])
      mass = {}
      id = 555
      def floodfill(r, c, id):
         nonlocal R, C, mat, mass
         if 0 <= r < R and 0 <= c < C and mat[r][c] == 1:
            mat[r][c] = id
            mass[id] += 1
            for r2, c2 in [(r + 1, c), (r − 1, c), (r, c + 1),
               (r, c − 1)]:
               floodfill(r2, c2, id)
                  for r in range(R):
      for c in range(C):
         if mat[r][c] == 1:
            id += 1
            mass[id] = 0
            floodfill(r, c, id)
      ans = max([val for val in mass.values()] + [1])
      for r in range(R):
         for c in range(C):
            if mat[r][c] != 0:
               continue
            island_set = set()
            for r2, c2 in [(r + 1, c), (r − 1, c), (r, c + 1),(r, c − 1)]:
               if 0 <= r2 < R and 0 <= c2 < C and mat[r2][c2]:
                  island_set.add(mat[r2][c2])
               ans = max(ans, 1 + sum([mass[island] for island in island_set]))
         return ans
ob = Solution()
matrix = [
   [1, 0, 1],
   [0, 0, 0],
   [1, 1, 0],
   [1, 1, 1]
]
print(ob.solve(matrix))

输入

[
[1, 0, 1],
[0, 0, 0],
[1, 1, 0],
[1, 1, 1] ]

输出

7

更新于: 2020-12-26

131 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告