给定一个 m x n 的矩阵,如果一个元素为 0 ,SADW则将其所在行和列的所有元素都设为 0 。请使用 原地 算法
是什么?
置零排序
怎么做?
原地算法
思考
原地算法,又看到这个词了,上次是原地哈希,有点亲切,这道题也不是很难,确定零的位置,然后像炸弹弹里的十字炸弹一样换零就可以了
代码
class Solution {
public void setZeroes(int[][] matrix) {
if (matrix == null || matrix.length == 0) return;
// 定义行列长度
int m = matrix.length, n = matrix[0].length;
// 给后面的if语句使用
boolean row0 = false, col0 = false;
// 配合if语句使用,判断这一行是否存在0
for (int i = 0;i < m;i++) {
if (matrix[i][0] == 0) col0 = true;
}
// 同上,判断这一列是否存在0
for (int j = 0;j < n;j++) {
if (matrix[0][j] == 0) row0 = true;
}
// 使用第一行和第一列作为标记
// 遍历矩阵内部元素(除第一行和第一列外),若当前元素为 0
// 则将其所在行首和列首标记为 0
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (matrix[i][j] == 0) {
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
// 根据标记将元素置零
// 遍历矩阵内部元素,若其所在行首或列首为 0
// 则将该元素置为 0
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (matrix[i][0] == 0 || matrix[0][j] == 0) {
matrix[i][j] = 0;
}
}
}
// 处理第一行
// 如果第一行中存在 0,则将第一行所有元素置零
if (row0) {
for (int i = 0; i <= n; i++) {
matrix[0][i] = 0;
}
}
// 处理第一列
// 如果第一列中存在 0,则将第一列所有元素置零
if (col0) {
for (int i = 0; i <= m; i++) {
matrix[i][0] = 0;
}
}
}
}
