📅  最后修改于: 2023-12-03 15:21:40.935000             🧑  作者: Mango
在二进制网格中,我们给定的运算只能是将某个位置上的数字 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