题目信息
LeetCode地址: . - 力扣(LeetCode)
题目理解
矩阵是m*n的,如果某个元素(i,j)等于0,则将第i行和第j列的所有元素都置零。既然如此,我们可以便利每一个元素,并记录下哪一行哪一列有零。记录完毕后,重新遍历整个矩阵,如果其所在行或者所在列存在零,则置为零。
所以问题变成了,在哪里保存这些信息: 哪一行哪一列有零
我们可以通过一个m长和n长的数组来保存这些信息,这会产生O(m+n)的额外空间复杂度。
我们也可以把这些信息直接保存在矩阵的第一列和第一行!代价是我们要提前遍历第一行和第一列,检查其是否存在零,如果是,最后我们需要把第一列或者第一行的所有元素都置零。
O(m+n)额外空间复杂度写法
java
public void setZeroes(int[][] matrix) {
int[] row = new int[matrix.length];
int[] col = new int[matrix[0].length];
for (int i = 0; i<matrix.length; i++) {
for (int j = 0; j<matrix[0].length; j++) {
if (matrix[i][j] == 0) {
row[i] = 1;
col[j] = 1;
}
}
}
for (int i = 0; i<matrix.length; i++) {
for (int j = 0; j<matrix[0].length; j++) {
if (row[i] == 1 || col[j] == 1) {
matrix[i][j] = 0;
}
}
}
}
O(1)额外空间复杂度写法
java
public void setZeroes(int[][] matrix) {
boolean firstRow = false;
boolean firstCol = false;
for (int i = 0; i<matrix.length; i++) {
if (matrix[i][0] == 0) {
firstCol = true;
break;
}
}
for (int j = 0; j<matrix[0].length; j++) {
if (matrix[0][j] == 0) {
firstRow = true;
break;
}
}
for (int i=1;i < matrix.length; i++) {
for (int j = 1; j<matrix[0].length; j++) {
if (matrix[i][j] == 0) {
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
for (int i =1; i<matrix.length; i++) {
for (int j = 1; j<matrix[0].length; j++) {
if (matrix[i][0] == 0 || matrix[0][j] == 0) {
matrix[i][j] = 0;
}
}
}
if (firstCol) {
for (int i =0; i<matrix.length; i++) {
matrix[i][0] = 0;
}
}
if (firstRow) {
for (int i =0; i<matrix[0].length; i++) {
matrix[0][i] = 0;
}
}
}