Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
Follow up:
Did you use extra space?
A straight forward solution using O(mn) space is probably a bad idea.
A simple improvement uses O(m + n) space, but still not the best solution.
Could you devise a constant space solution?
把矩阵中0元素所在的行和列的所有元素都改成0.
public class Solution {
public void setZeroes(int[][] matrix) {
boolean firstRowZero = false;
boolean firstColumnZero = false;
// ------------------------------ 第一步
// 标记第一行,列 是否有0
/*
* 1 0 0 2
2
3
4
*/
// firstRowZero = true, firstColumnZero = false;
// set first row and column zero or not
for (int i = 0; i < matrix.length; i++) {
if (matrix[i][0] == 0) {
firstColumnZero = true;
break;
}
}
for (int i = 0; i < matrix[0].length; i++) {
if (matrix[0][i] == 0) {
firstRowZero = true;
break;
}
}
// ------------------------------ End
// ------------------------------ 第二步
// 从行,列 各第二个数开始遍历,当遇到0,则把行,列 第一个数制成0
/*
0 3 4
2 1 2
5 6 7
*/
// 比如 i = 1, j = 1; 则 matrix[1][0] = 0, matrix[0][1] = 0
/*
* 1 0 0 2
2 0 3 4
3 2 1 2
4 5 6 7
*
* 原矩阵就成
*
* 1 0 0 2
0 0 3 4
3 2 1 2
4 5 6 7
*/
// 此函数就是过滤出矩阵中所有带0的列和行,在第一行和第一列制成0做标记给下一函数用
// mark zeros on first row and column
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;
}
}
}
// ------------------------------ End
// ------------------------------ 第三步
// 上个函数已经过滤掉所有带0的行和列,在这只需要遍历矩阵
// 只要第一个行或列的第一位为0 就把行或列全制成0
/*
* 上个函数过滤掉后成
*
* 1 0 0 2
0 0 3 4
3 2 1 2
4 5 6 7
*/
/*
* 这函数完,原矩阵就成
* 1 0 0 2
0 0 0 0
3 0 0 2
4 0 0 7
*/
// use mark to set elements
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;
}
}
}
// ------------------------------ End
// ------------------------------ 第四步
// 第一行和第一列的初始0,不应该参与2,3步操作,不然遍历整个矩阵,
//发现0元素之后就将这个元素所在的行和列都设置成0。所以整个矩阵都是0.
// 所以一开始标记好第一行和第一列是否有0 且 以上操作都是从1开始遍历
// 这函数就是如果有就替换掉对应的第一行或第一列
/*
* 上个函数过滤掉后成
*
* 1 0 0 2
0 0 0 0
3 0 0 2
4 0 0 7
*/
/*
* 这函数完,原矩阵就成
* 0 0 0 0
0 0 0 0
3 0 0 2
4 0 0 7
*/
// set first column and row
if (firstColumnZero) {
for (int i = 0; i < matrix.length; i++)
matrix[i][0] = 0;
}
if (firstRowZero) {
for (int i = 0; i < matrix[0].length; i++)
matrix[0][i] = 0;
}
// ------------------------------ End
}
}