📌  相关文章
📜  通过用 0 替换 K 的邻居来最小化使所有 Matrix 元素为 0 的步骤计数(1)

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

通过用 0 替换 K 的邻居来最小化使所有 Matrix 元素为 0 的步骤计数

在矩阵中,有一些元素的值为 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)。