题目描述
请编写一个算法,若MxN矩阵中某个元素为0,则将其所在的行与列清零。
给定一个MxN的int[][]矩阵(C++中为vector>)mat和矩阵的阶数n,请返回完成操作后的int[][]矩阵(C++中为vector>),保证n小于等于300,矩阵中的元素为int范围内。
测试样例:
[[1,2,3],[0,1,2],[0,0,1]]
返回:[[0,0,3],[0,0,0],[0,0,0]]
思路:遍历二维数组,记录值为0的行号、列好,,然后根据行号、列号,逐位清零
C/C++实现
用到动态数组声明并初始化,,
class Clearer {
public:
vector<vector<int> > clearZero(vector<vector<int> > mat, int n) {
// write code here
//bool row[n];
//bool colum [n];
if(mat.empty())
return vector<vector<int> >();
int len1=mat.size();
int len2=mat[0].size();
bool *row=new bool[len1]();//切记声明后一定要加小括号初始化,否则报错!!
bool *colum =new bool[len2]();
for (int i=0;i<len1;i++)
for(int j=0; j<len2;j++){
if(mat[i][j]==0)
{
row[i]=true;
colum[j]=true;
}
}
for (int i=0;i<len1;i++)
for(int j=0; j<len2;j++){
if(row[i] || colum[j] ){
mat[i][j]=0;
}
}
delete [] row;
delete [] colum ;
return mat;
}
};
Java实现
Java实现相对较为简单
import java.util.*;
public class Clearer {
public int[][] clearZero(int[][] matrix, int n) {
// write code here
boolean[] row = new boolean[n];
boolean[] column = new boolean[n];
for (int i = 0; i < matrix.length; i++)
{
for (int j = 0; j < matrix[0].length; j++)
{
if (matrix[i][j] == 0)
{
row[i] = true;
column[j] = true;
}
}
}
for (int i = 0; i < matrix.length; i++)
{
for (int j = 0; j < matrix[0].length; j++)
{
if(row[i] || column[j])
{
matrix[i][j] = 0;
}
}
}
return matrix ;
}
}