📜  二维字符串矩阵中连接的组件数(1)

📅  最后修改于: 2023-12-03 14:49:01.761000             🧑  作者: Mango

二维字符串矩阵中连接的组件数

简介

二维字符串矩阵中连接的组件数是一个经典的计算问题,要求计算给定二维字符串矩阵中连续相邻的元素所形成的连接组件的数量。

假设给定的二维字符串矩阵为 grid,其中包含两种字符形式的元素:'1''0'。当两个 '1' 在水平或垂直方向相邻时,它们可以被认为是连接的。需要判断矩阵中连接的 '1' 组成的连通图数量。

例如,给定以下的矩阵 grid:

11110
11010
11000
00000

连接的组件分别为 [1, 1, 1, 1][1, 1]。总共有 2 个连接的组件,因此返回结果为 2。

解决方案

二维字符串矩阵中连接的组件数可以通过深度优先搜索(DFS)或广度优先搜索(BFS)两种常用的算法来解决。

解法 1: 深度优先搜索(DFS)

DFS 是一种递归的搜索算法,用于遍历或搜索可以表示为树或图的数据结构。对于二维字符串矩阵的连通性问题,可以通过 DFS 来统计连接组件的数量。

算法步骤:

  1. 初始化计数器 count 为 0,用于记录连接组件的数量。
  2. 遍历矩阵中的每个元素:
    • 如果遇到 '1',则递归调用 DFS 函数,并将当前元素的坐标作为参数传递给 DFS 函数。
    • 在 DFS 函数中,将当前元素标记为已访问,然后递归地访问当前元素的上、下、左、右四个相邻元素,如果相邻元素为 '1' 且未被访问过,则将其坐标作为参数传递给 DFS 函数。
    • 在递归访问相邻元素之后,将结果加入 count 中。
  3. 返回 count,即连接组件的数量。
解法 2: 广度优先搜索(BFS)

BFS 是一种遍历或搜索算法,用于从起始节点开始逐层扩展搜索区域。对于二维字符串矩阵的连通性问题,也可以通过 BFS 来统计连接组件的数量。

算法步骤:

  1. 初始化计数器 count 为 0,用于记录连接组件的数量。
  2. 遍历矩阵中的每个元素:
    • 如果遇到 '1',则将其坐标加入队列,并将其标记为已访问。
    • 在循环队列中,每次取出队列中的头部元素,并访问其上、下、左、右四个相邻元素,如果相邻元素为 '1' 且未被访问过,则将其坐标加入队列,并将其标记为已访问。
    • 在每次循环结束后,将结果加入 count 中。
  3. 返回 count,即连接组件的数量。
复杂度分析
  • 时间复杂度:解法 1 和解法 2 都需要遍历整个矩阵,时间复杂度为 O(m * n),其中 m 和 n 分别为矩阵的行数和列数。
  • 空间复杂度:解法 1 中使用了递归调用,可能会导致栈空间的使用,最坏情况下达到 O(m * n);解法 2 中使用了队列来存储待访问的节点,空间复杂度为 O(m * n)。
示例代码
class Solution:
    def numIslands(self, grid):
        if not grid:
            return 0
        
        def dfs(i, j):
            if i < 0 or i >= len(grid) or j < 0 or j >= len(grid[0]) or grid[i][j] != '1':
                return
            grid[i][j] = '0'
            dfs(i-1, j)
            dfs(i+1, j)
            dfs(i, j-1)
            dfs(i, j+1)
        
        count = 0
        for i in range(len(grid)):
            for j in range(len(grid[0])):
                if grid[i][j] == '1':
                    count += 1
                    dfs(i, j)
        
        return count
参考链接