描述
编写一种算法,若M × N矩阵中某个元素为0,则将其所在的行与列清零。
示例 1:
输入:
[
[1,1,1],
[1,0,1],
[1,1,1]
]
输出:
[
[1,0,1],
[0,0,0],
[1,0,1]
]
示例 2:
输入:
[
[0,1,2,0],
[3,4,5,2],
[1,3,1,5]
]
输出:
[
[0,0,0,0],
[0,4,5,0],
[0,3,1,0]
]
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/zero-matrix-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析
遍历矩阵遇到0,在第一行第一列标记,省去创建两个标记数组。
对于第一列与第一行上的0,用两个变量标记是否存在0.
class Solution {
public void setZeroes(int[][] matrix) {
boolean top = false, left = false;
int m = matrix.length, n = matrix[0].length;
for (int i = 0; i < n; i++) {
if (matrix[0][i] == 0) {
top = true;
break;
}
}
for (int i = 0; i < m; i++) {
if (matrix[i][0] == 0) {
left = true;
break;
}
}
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;
}
}
}
for (int i = 1; i < n; i++) {
if (matrix[0][i] == 0) {
process(matrix,0,i,true);
}
}
for (int i = 1; i < m; i++) {
if (matrix[i][0] == 0) {
process(matrix,i,0,false);
}
}
if (top) {
process(matrix,0,0,false);
}
if (left) {
process(matrix,0,0,true);
}
}
public void process(int[][] matrix, int a, int b, boolean l) {
if (l) {
for (int i = 0; i < matrix.length; i++) {
matrix[i][b] = 0;
}
} else {
for (int i = 0; i < matrix[0].length; i++) {
matrix[a][i] = 0;
}
}
}
}