📌  相关文章
📜  在二进制矩阵中计数 1,其行和列的剩余索引用 0 填充(1)

📅  最后修改于: 2023-12-03 15:23:29.405000             🧑  作者: Mango

在二进制矩阵中计数 1,其行和列的剩余索引用 0 填充

在二进制矩阵中计数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。

最后,以上实现仅供参考,实际应用时需要根据具体场景进行调整和优化。