73. 矩阵置零
1.题目描述及示例
-
题目描述
给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。 -
示例
2.题解思路及代码
- 思路
(1)必须得先假设所有的输入矩阵中不含某个数字,我这里设为1000,当然可以是其他数,我没一个个试。
(2)对矩阵中的每个数遍历,遇到0就将其所在的行和列上的数全置为1000,然后再对矩阵进行遍历,遇到1000就将该数字置为0。所以要先假设所有的输入矩阵中不含1000,不然就可能把原来就为1000的数也置为0。
(3)这种方式只能保证空间复杂度为常量,但时间复杂度高,因为题目要求用常量空间解决问题。 - 代码
//这里我用递归方式解决的,但还不如用普通方式
public void setZeroes(int[][] matrix) {
int unique=1000;
if (matrix==null||matrix.length==0)
return;
for (int i=0;i<matrix.length;i++)
for (int j=0;j<matrix[0].length;j++)
{
if (matrix[i][j]==0)
setZero(matrix,i,j,unique);
}
for (int i=0;i<matrix.length;i++)
for (int j=0;j<matrix[0].length;j++)
{
if (matrix[i][j]==unique)
matrix[i][j]=0;
}
}
public void setZero(int[][] matrix,int i,int j,int unique) {
for (int jj=j-1;jj>=0;jj--)
{
if (matrix[i][jj]!=0)
matrix[i][jj]=unique;
}
for (int ii=i-1;ii>=0;ii--)
{
if (matrix[ii][j]!=0)
matrix[ii][j]=unique;
}
for (int jj=j+1;jj<matrix[0].length;jj++)
{
if (matrix[i][jj]!=0)
matrix[i][jj]=unique;
else if (matrix[i][jj]==0)
{
setZero(matrix,i,jj,unique);
}
}
for (int ii=i+1;ii<matrix.length;ii++)
{
if (matrix[ii][j]!=0)
matrix[ii][j]=unique;
else if (matrix[ii][j]==0)
{
setZero(matrix,ii,j,unique);
}
}
}