📅  最后修改于: 2023-12-03 15:42:02.967000             🧑  作者: Mango
在矩阵中,有一些元素的值为 0,多次行动后,我们希望将所有这些元素都设为 0。每一步操作是将 Matrix[i][j] 的值替换为 Matrix[i-K][j-K]、Matrix[i-K][j+K]、Matrix[i+K][j-K]、Matrix[i+K][j+K] 中的最大值。直到所有元素均为 0 为止。现在,请你计算至少运行多少次操作才能将矩阵中所有元素都设置为 0。
在题目中,我们需要将元素值为 0 的部分全部变成 0。而每一次操作都会影响到 4KK 的范围。因此,一开始我们可以将所有为 0 的元素压入队列中。对于每一个元素,我们可以分别对它的四个方向进行操作,也就是将 4KK 的范围内的元素的值赋为它的值,这个过程用一个循环就可以实现。在以上所有元素都被操作后,我们可以更新原矩阵,同时寻找出新的为 0 的元素,再将它们加入队列中,不断执行上述过程,直到队列为空。
def MatrixToZero(Matrix: List[List[int]], K: int) -> int:
zeroes = []
for i in range(len(Matrix)):
for j in range(len(Matrix[0])):
if Matrix[i][j] == 0:
zeroes.append((i, j))
steps = 0
while zeroes:
next_zeroes = []
for (i, j) in zeroes:
for (delta_i, delta_j) in [(k, l) for k in range(-K, K+1) for l in range(-K, K+1)]:
neighbor_i, neighbor_j = i + delta_i, j + delta_j
if 0 <= neighbor_i < len(Matrix) and 0 <= neighbor_j < len(Matrix[0]) and Matrix[neighbor_i][neighbor_j] > steps:
Matrix[neighbor_i][neighbor_j] = steps + 1
next_zeroes.append((neighbor_i, neighbor_j))
zeroes = next_zeroes
steps += 1
return steps
每次操作最坏需要影响 4K*K 的元素,因此时间复杂度可以看做 O(n * k^2)。由于我们需要对所有元素至少操作一次,因此空间复杂度为 O(n)。