📅  最后修改于: 2023-12-03 15:23:29.405000             🧑  作者: Mango
在二进制矩阵中计数1的数量是很常规的操作。但有时候我们需要在矩阵中标记出没有1的行和列,可以将这些行和列的剩余索引用0填充。
给定一个二进制矩阵 mat,其中 1 表示陆地,0 表示海洋。矩阵中每个格子与其四个相邻格子上下左右相连。如果两个陆地格子在水平或竖直方向上相邻,则它们被认为是"相连的陆地"。
请你在矩阵中找出独立的 "岛屿" 数量,然后将所在行、列的剩余索引用0填充。要求输出填充后的二维数组。
示例:
# 输入
mat = [[1, 1, 1, 1, 0],
[1, 1, 0, 1, 0],
[1, 1, 0, 0, 0],
[0, 0, 0, 0, 0]]
# 输出
[[1, 1, 1, 1, 0],
[1, 1, 0, 1, 0],
[1, 1, 0, 0, 0],
[0, 0, 0, 0, 0]]
# 解释
共有三个岛屿。
第一个岛屿包含图中全部 1。
第二个岛屿包含 1 和 3 号列。
第三个岛屿包含 2 号列。
1 号列和 4 号列没有岛屿,因此行列的剩余索引用0填充。
使用深度优先搜索(DFS)来遍历图,将所有 1 到 0 的连通部分全部遍历一遍。然后再遍历一次矩阵,对于每个值为0的位置,判断对应的行和列是否有1,如果没有1则用0填充。
具体实现可以参考下面的代码:
class Solution(object):
def fillZero(self, mat):
"""
:type mat: List[List[int]]
:rtype: List[List[int]]
"""
# 深度优先搜索
def dfs(i, j):
# 返回条件
if i < 0 or j < 0 or i >= m or j >= n or mat[i][j] != 1:
return
# 将访问过的位置赋值为0
mat[i][j] = 0
# 搜索相邻的位置
dfs(i + 1, j)
dfs(i - 1, j)
dfs(i, j + 1)
dfs(i, j - 1)
return
# 计算矩阵行数和列数
m, n = len(mat), len(mat[0])
# 遍历矩阵
for i in range(m):
for j in range(n):
if mat[i][j] == 1:
# 如果找到1,则将访问到的所有位置标记为0
dfs(i, j)
# 填充行列为0的位置
for i in range(m):
for j in range(n):
if mat[i][j] == 0:
# 判断该位置所在行是否有1
if 1 not in mat[i]:
mat[i] = [0] * n
# 判断该位置所在列是否有1
elif all(mat[k][j] == 0 for k in range(m)):
for k in range(m):
mat[k][j] = 0
return mat
本题的解法是DFS。思路相对简单,但是需要注意细节,比如在遍历矩阵过程中不能直接将访问到的位置标记为0,而是需要深度优先搜索遍历整个连通部分后再将其标记为0。同时,在填充行列为0的位置时,需要分别判断该位置所在行和列是否有1。
最后,以上实现仅供参考,实际应用时需要根据具体场景进行调整和优化。