假设我们有一个二进制矩阵。我们必须找到相同的矩阵,但是每个像元的值都是到最接近0的曼哈顿距离。我们可以假设矩阵中至少存在一个0。
所以,如果输入像
1 | 0 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
那么输出将是
1 | 0 | 1 |
1 | 0 | 1 |
2 | 1 | 0 |
因为只有左下角的单元格的距离是2到最接近的0。
为了解决这个问题,我们将遵循以下步骤-
m:=矩阵的行大小,n:=矩阵的列大小
对于0到m范围内的y,执行
如果matrix [y,x]不为零,则
矩阵[y,x]:=无穷大
对于0到n范围内的x,执行
对于0到m范围内的y,执行
如果y不为零,则
如果x不为零,则
matrix [y,x] =矩阵[y,x]和矩阵[y-1,x] +1的最小值
矩阵[y,x] =矩阵[y,x]和矩阵[y,x-1] +1的最小值
对于0到n范围内的x,执行
对于y在m-1到0的范围内,减1,
如果y + 1 <m,则
如果x + 1 <n,则
矩阵[y,x] =矩阵[y,x]和矩阵[y + 1,x] +1的最小值
矩阵[y,x] =矩阵[y,x]和矩阵[y,x + 1] +1的最小值
对于范围n-1到0的x,减1,
返回矩阵
让我们看下面的实现以更好地理解-
import math class Solution: def solve(self, matrix): m, n = len(matrix), len(matrix[0]) for y in range(m): for x in range(n): if matrix[y][x]: matrix[y][x] = math.inf for y in range(m): for x in range(n): if y: matrix[y][x] = min(matrix[y][x], matrix[y - 1][x] + 1) if x: matrix[y][x] = min(matrix[y][x], matrix[y][x - 1] + 1) for y in range(m - 1, -1, -1): for x in range(n - 1, -1, -1): if y + 1 < m: matrix[y][x] = min(matrix[y][x], matrix[y + 1][x] + 1) if x + 1 < n: matrix[y][x] = min(matrix[y][x], matrix[y][x + 1] + 1) return matrix ob = Solution()matrix = [ [1, 0, 1], [1, 0, 1], [1, 1, 0] ] print(ob.solve(matrix))
[[1, 0, 1], [1, 0, 1], [1, 1, 0] ]
输出结果
[[1, 0, 1], [1, 0, 1], [2, 1, 0]]