/**
* Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
click to show follow up.
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所在的位置,容易出现的两个问题
* 1.由于一开始要用第一行和第一列记录,所以它们的数据是不能变的,所以应该首先用两个布尔类型记录
* 它们里边是否存在0,第一行存在0的话,最后要把第一行全部置零,第一列存在0,最后将第一列全部置零
* 2.记录下0的位置之后,再根据0的位置将对应行列置零,注意这时还是不能改变第一行和第一列的位置,
* 因为行列置零是分别进行的,第一行和第一列的数据后边要用到,不能改变*/
public class Q73SetMatrixZeroes {
public static void main(String[] args) {
int[][] matrix = new int[][]{{0,0,0,5},{4,3,1,4},{0,1,1,4},{1,2,1,3},{0,0,1,1}};
setZeroes(matrix);
for (int i = 0; i < matrix.length; i++) {
System.out.println(Arrays.toString(matrix[i]));
}
}
public static void setZeroes(int[][] matrix) {
boolean row = false;
boolean col = false;
int m = matrix.length;
int n = matrix[0].length;
//判断第一列和第一行有没有0
for (int i = 0; i < m; i++) {
if (matrix[i][0] == 0)
{
col = true;
break;
}
}
for (int i = 0; i < n; i++) {
if (matrix[0][i] == 0)
{
row = true;
break;
}
}
//用第一行和第一列记录下数列中出现的0的位置
for(int i = 1;i < m;i++)
{
for (int j = 1; j < n; j++) {
if (matrix[i][j] == 0)
{
matrix[0][j] = 0;
matrix[i][0] = 0;
}
}
}
//根据0的位置将它所在的列全部置零
for (int i = 1;i < n;i++)
{
if (matrix[0][i] == 0)
{
for (int j = 1;j < m;j++)
matrix[j][i] = 0;
}
}
//根据0的位置将它所在的行全部置零
for (int i = 1;i < m;i++)
{
if (matrix[i][0] == 0)
{
for (int j = 1;j < n;j++)
matrix[i][j] = 0;
}
}
//如果第一行存在0那么将第一行全部置零
if (row == true)
{
for (int i = 0; i < n; i++) {
matrix[0][i] = 0;
}
}
//如果第一列存在0那么将第一列全部置零
if (col == true)
{
for (int i = 0; i < m; i++) {
matrix[i][0] = 0;
}
}
}
}