在二进制矩阵中查找最大路径长度
给定一个方阵mat ,其中每个元素都是0或1 。值 1 表示已连接,0 表示未连接。任务是在将最多一个 0更改为1后找到矩阵中路径的最大长度。路径是 4 向连接的 1 组。
例子:
Input: mat[][] = {{1, 1}, {1, 0}}
Output: 4
Change the only 0 to 1 and the length of the largest path will be 4.
Input: mat[][] = {{1, 1}, {1, 1}}
Output: 4
朴素的方法:想法是将每个“0”一个一个地更改为“1”,并进行深度优先搜索以找到最大路径的大小。
高效的方法:在朴素的方法中,我们检查了每个“0”。但是,我们也可以通过存储每个组的大小来提高效率,这样我们就不必使用深度优先搜索来重复计算相同的大小。
注意:当 0 接触到同一组时,我们需要小心。例如,考虑 grid = [[0, 1], [1, 1]]。改变0比1后的0的右侧和底部的邻居将属于同一组。
我们可以通过跟踪组Id (或Index )来解决这个问题,这对于每个组都是唯一的。
- 对于每个组,用值Index填充它并记住它的大小作为数组area[Index]中的一个元素,可以通过深度优先搜索找到它。
- 然后对于每个0 ,查看相邻的组 ID 并添加这些组的面积,并为我们正在切换的 0添加 1。这会给我们答案,我们从之前的答案中取最大值。
下面是上述方法的实现:
Python3
# Python3 implementation of above approach
# check if index is within range
def neighbors(r, c, N):
for nr, nc in ((r - 1, c), (r + 1, c), (r, c - 1), (r, c + 1)):
if 0 <= nr < N and 0 <= nc < N:
yield nr, nc
# dfs to calculate length of path
def dfs(R, C, index, grid, N):
ans = 1
grid[R][C] = index
for nr, nc in neighbors(R, C, N):
if grid[nr][nc] == 1:
ans += dfs(nr, nc, index)
return ans
# function to return largest possible length of Path
def largestPath(grid):
N = len(grid)
area = {}
index = 2
for i in range(N):
for j in range(N):
if grid[i][j] == 1:
area[index] = dfs(i, j, index, grid, N)
index += 1
ans = max(area.values() or [0])
for i in range(N):
for j in range(N):
if grid[i][j] == 0:
seen = {grid[nr][nc] for nr, nc in neighbors(i, j, N) if grid[nr][nc] > 1}
ans = max(ans, 1 + sum(area[i] for i in seen))
# return maximum possible length
return ans
# Driver code
I = [[1, 0], [0, 1]]
# Function call to print answer
print(largestPath(I))
# This code is written by
# Sanjit_Prasad
输出:
3
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。