📜  二进制网格中最长连接 1 的长度(1)

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

二进制网格中最长连接 1 的长度

在二进制网格中,我们给定的运算只能是将某个位置上的数字 1 变成数字 0 或者将数字 0 变成 1。在网格中有多个 1 连在一起时,它们被称作连接。同一个方向的相邻连接称作一条联通路径。找到并返回网格中最长的联通路径长度。

示例

给定二进制网格 grid

11110
11010
11000
00001

最长的联通路径是 3。

思路

本题可以使用深度优先搜索(DFS)或广度优先搜索(BFS)来解决。具体地,从每个数字为 1 的位置开始进行 DFS 或 BFS,并更新最大联通路径长度。

由于 DFS 和 BFS 的实现可以有多种不同的方式,因此代码实现也有一定的灵活性。

下面给出一种 DFS 的实现方式。

class Solution:
    def longestConsecutiveOne(self, grid: List[List[int]]) -> int:
        def dfs(i, j):
            # 将当前访问的位置标记为已访问
            visited[i][j] = True
            # 统计当前位置所在联通分量中的 1 的数量
            count[0] += 1
            # 搜索当前位置的四个相邻位置
            for x, y in [(i+1, j), (i-1, j), (i, j+1), (i, j-1)]:
                if 0 <= x < m and 0 <= y < n and grid[x][y] == 1 and not visited[x][y]:
                    dfs(x, y)
        
        if not grid:
            return 0
        
        m, n = len(grid), len(grid[0])
        visited = [[False] * n for _ in range(m)]
        res = 0
        # 对于每个没有被访问过的 1,进行 DFS
        for i in range(m):
            for j in range(n):
                if grid[i][j] == 1 and not visited[i][j]:
                    count = [0]
                    dfs(i, j)
                    # 更新最长联通路径长度
                    res = max(res, count[0])
        return res
复杂度分析
  • 时间复杂度:$O(mn)$,其中 $m$ 和 $n$ 分别为网格的行数和列数。对于每个位置最多访问一次,因此最坏情况下的时间复杂度为 $O(mn)$。
  • 空间复杂度:$O(mn)$,其中 $m$ 和 $n$ 分别为网格的行数和列数。需要使用 $O(mn)$ 的空间记录每个位置是否已经被访问。在最坏情况下,整个网格都是 1,因此需要 $O(nm)$ 的额外空间用于存储 DFS 的递归调用栈。