问题描述
Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
解决思路
难点在于如何不使用辅助空间。
一个巧妙的想法是,
1. 使用两个标记变量,row0_has_zeros和col0_has_zeros分别表示矩阵中的第一行和第一列中是否包含0元素;
2. 从矩阵的内层元素开始遍历,如果矩阵元素为0,则将相应的第一行和第一列对齐元素置为0;
3. 再从矩阵的内层元素开始遍历,遍历的过程中,检查对应的第一行和第一列元素是否为0,如果为0则将该元素置为0;
4. 最后根据两个标记变量,决定是否需要将第一行和第一列的元素全部都置为0.
时间复杂度为O(n^2),空间复杂度为O(1).
程序
public class Solution {
public void setZeroes(int[][] matrix) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return;
}
boolean row0_has_zeros = false;
boolean col0_has_zeros = false;
for (int i = 0; i < matrix[0].length; i++) {
if (matrix[0][i] == 0) {
row0_has_zeros = true;
break;
}
}
for (int i = 0; i < matrix.length; i++) {
if (matrix[i][0] == 0) {
col0_has_zeros = true;
break;
}
}
for (int i = 1; i < matrix.length; i++) {
for (int j = 1; j < matrix[0].length; j++) {
if (matrix[i][j] == 0) {
matrix[0][j] = 0;
matrix[i][0] = 0;
}
}
}
for (int i = 1; i < matrix.length; i++) {
for (int j = 1; j < matrix[0].length; j++) {
if (matrix[0][j] == 0 || matrix[i][0] == 0) {
matrix[i][j] = 0;
}
}
}
if (row0_has_zeros) {
for (int i = 0; i < matrix[0].length; i++) {
matrix[0][i] = 0;
}
}
if (col0_has_zeros) {
for (int i = 0; i < matrix.length; i++) {
matrix[i][0] = 0;
}
}
}
}