LeetCode矩阵置零
矩阵置零是一道经典的 LeetCode 题目,旨在将矩阵中所有值为 0 的行和列都置为 0。本题可以考察对于数组、变量、循环和条件语句等基本概念的掌握,同时也需要了解相关的数据结构以及基本算法思路。
一、题目描述
给定一个 m x n 的矩阵 matrix,如果一个元素为 0,则将其所在行和列都置为 0。要求使用空间复杂度为 O(1) 的方法。
例如,给定矩阵 matrix 如下:
[
[1, 1, 1],
[1, 0, 1],
[1, 1, 1]
]
则调用函数后,矩阵变为:
[
[1, 0, 1],
[0, 0, 0],
[1, 0, 1]
]
二、思路分析
本题要求将矩阵中的 0 所在的行和列都置为 0,可以考虑使用两个数组来记录哪些行和列需要被置为 0。
具体地,我们遍历矩阵 matrix,如果 matrix[i][j] 的值为 0,则将第 i 行和第 j 列分别置为 0。最后再次遍历矩阵 matrix,将对应行和列上的值都置为 0。
由于题目要求使用 O(1) 的空间复杂度,我们可以使用矩阵 matrix 中的第一行和第一列来记录哪些行和列需要被置为 0。
注意到第一个位置 matrix[0][0] 既可以表示第一行也可以表示第一列需要被置为 0,如果我们使用这个位置来表示第一行需要被置为 0,那么矩阵原本的 matrix[0][0] 的值就会丢失。因此,我们需要使用一个额外的变量来记录第一列是否需要被置为 0。
三、代码实现
public void setZeroes(int[][] matrix) {
int rows = matrix.length;
int cols = matrix[0].length;
boolean firstColZero = false;
for (int i = 0; i < rows; i++) {
// 如果第一列需要被置为 0
if (matrix[i][0] == 0) {
firstColZero = true;
}
for (int j = 1; j < cols; j++) {
if (matrix[i][j] == 0) {
// 将第 i 行和第 j 列分别标记为 0
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
// 根据第一列和第一行的标记将矩阵中的值进行清零
for (int i = 1; i < rows; i++) {
for (int j = 1; j < cols; j++) {
if (matrix[i][0] == 0 || matrix[0][j] == 0) {
matrix[i][j] = 0;
}
}
}
// 处理第一行
if (matrix[0][0] == 0) {
for (int j = 0; j < cols; j++) {
matrix[0][j] = 0;
}
}
// 处理第一列
if (firstColZero) {
for (int i = 0; i < rows; i++) {
matrix[i][0] = 0;
}
}
}
四、总结
矩阵置零是一道经典的 LeetCode 题目,可以考察对于数组、变量、循环和条件语句等基本概念的掌握,同时也需要了解相关的数据结构以及基本算法思路。
本题主要的思路是使用矩阵 matrix 中的第一行和第一列来记录哪些行和列需要被置为 0,通过两次遍历分别对行和列进行标记,最后再次遍历矩阵 matrix,将对应行和列上的值都置为 0。
需要注意的是,第一个位置 matrix[0][0] 既可以表示第一行也可以表示第一列需要被置为 0,因此需要使用一个额外的变量来记录第一列是否需要被置为 0。
本题的代码实现中,还需要考虑边界条件和特殊情况。通过对本题的学习,可以提升对于数组、变量、循环和条件语句等基本概念的掌握程度,同时也有助于培养编程思维和算法思维。