一、题目
编写一种算法,若M × N矩阵中某个元素为0,则将其所在的行与列清零。
点击此处跳转题目。
示例 1:
输入:
[
[1,1,1],
[1,0,1],
[1,1,1]
]
输出:
[
[1,0,1],
[0,0,0],
[1,0,1]
]
示例 2:
输入:
[
[0,1,2,0],
[3,4,5,2],
[1,3,1,5]
]
输出:
[
[0,0,0,0],
[0,4,5,0],
[0,3,1,0]
]
二、C# 题解
此题有很多方法解,无外乎都是记录需要清零的行与列,这种写法太无聊了。这里提出一种递归的方式,只需要遍历矩阵一次即可。当遇到 0 时,使用 set0
变量记录该位置,遍历完成后,重置所有 set0
。
public class Solution {
public void SetZeroes(int[][] matrix) {
BFS(ref matrix, 0, 0); // 广度优先遍历
}
public void BFS(ref int[][] matrix, int i, int j) {
int m = matrix.Length, n = matrix[0].Length;
if (i == m && j == 0) return; // 递归出口
// 计算下一个位置
int next_i = i, next_j = j + 1;
if (next_j == n) {
next_j = 0;
next_i++;
}
bool set0 = matrix[i][j] == 0; // 记录当前状态,是否需要清零
BFS(ref matrix, next_i, next_j); // 继续遍历
// 最后执行清零
if (set0) {
for (int p = 0; p < n; p++) matrix[i][p] = 0;
for (int q = 0; q < m; q++) matrix[q][j] = 0;
}
}
}
- 时间复杂度: O ( m × n ) O(m\times n) O(m×n)。
- 空间复杂度:由矩阵中 0 出现的次数决定。
该方法依据元素记录,因此当矩阵中 0 出现次数过多时,会有重复操作,只适合处理稀疏 0 矩阵。文章来源:https://www.toymoban.com/news/detail-669284.html
矩阵中 0 过于密集时,使用记录行列的方式会更好些,但可能需要更多的空间和遍历次数。文章来源地址https://www.toymoban.com/news/detail-669284.html
到了这里,关于LeetCode 面试题 01.08. 零矩阵的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!