73. 矩阵置零 - 力扣(LeetCode)
一、题目
给定一个 m x n
的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。
示例 1:
输入:matrix = [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]
示例 2:
输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]] 输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]
提示:
- m == matrix.length
- n == matrix[0].length
- 1 <= m, n <= 200
- -2^31 <= matrix[i][j] <= 2^31 - 1
二、代码
class Solution {
public void setZeroes(int[][] matrix) {
// 单独标记第0列是否要全都变为0
boolean col0 = false;
// 后面我们就用col0标记第0列是否全变为0
// matrix[0~n-1][0]标记0~n-1行是否全变为0
// matrix[0][1~n-1]标记1~n-1列是否全变为0
// 遍历矩阵
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
// 如果一个位置的数为0
if (matrix[i][j] == 0) {
// 先去标记所在行是否全部变为0
// 这个数所在的行一定全都变为0,将0列对应的行设置为0
matrix[i][0] = 0;
// 再去标记所在列是否全部变为0
// 如果当前遍历的是第0列的,就用col变量单独标记
if (j == 0) {
col0 = true;
// 如果当前遍历的不是第0列的数,就用 matrix[0][1~n-1]去标记
} else {
matrix[0][j] = 0;
}
}
}
}
// 先按照matrix[0~n-1][0]和matrix[0][1~n-1]的标记结果,将0~n-1行和1~n-1列去根据标记情况都设置为0
// 注意需要从下往上变0,因为第0行是用来标记所在列是否都变为0的,如果从上往下变,一开始就会将第0行的标记信息抹掉,就会导致结果错误,第0行的标记要保留到最后
for (int i = matrix.length - 1; i >= 0; i--) {
for (int j = 1; j < matrix[0].length; j++) {
if (matrix[i][0] == 0 || matrix[0][j] == 0) {
matrix[i][j] = 0;
}
}
}
// 单独处理第0列
if (col0) {
// 将第0列都变为0
for (int i = 0; i < matrix.length; i++) {
matrix[i][0] = 0;
}
}
}
}
三、解题思路
准备一个变量,用来表示第0列要不要变零:
- 第0列用单独的一个变量表示要不要变0
- 然后每一行需不需要变0就还是用第0列来标识。
- 第1~n列要不要变0,就用第0行的1~n列来标识。