73. 矩阵置零
约 441 字大约 1 分钟
73. 矩阵置零
题目描述
给定一个 *m* x *n*
的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法**。**
示例:
输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]
解题思路
- 遍历整个矩阵,如果 cell[i][j] == 0 就将第 i 行和第 j 列的第一个元素标记。
- 第一行和第一列的标记是相同的,都是 cell[0][0],所以需要一个额外的变量告知第一列是否被标记,同时用 cell[0][0] 继续表示第一行的标记。
- 然后,从第二行第二列的元素开始遍历,如果第 r 行或者第 c 列被标记了,那么就将 cell[r][c] 设为 0。这里第一行和第一列的作用就相当于方法一中的 row_set 和 column_set 。
- 然后我们检查是否 cell[0][0] == 0 ,如果是则赋值第一行的元素为零。
- 然后检查第一列是否被标记,如果是则赋值第一列的元素为零。
class Solution {
public void setZeroes(int[][] matrix) {
if (matrix == null || matrix.length == 0) {
return;
}
boolean isCol = false;
int rows = matrix.length;
int cols = matrix[0].length;
for (int i = 0; i < rows; i++) {
if (matrix[i][0] == 0) {
isCol = true;
}
for (int j = 1; j < cols; j++) {
if (matrix[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 (isCol) {//顺序
for (int i = 0; i < rows; i++) {
matrix[i][0] = 0;
}
}
}
}