题目描述
编写一种算法,若M × N矩阵中某个元素为0,则将其所在的行与列清零。
示例1
输入: [ [1,1,1], [1,0,1], [1,1,1] ] 输出: [ [1,0,1], [0,0,0], [1,0,1] ]
示例2
输入:
[
[0,1,2,0],
[3,4,5,2],
[1,3,1,5]
]
输出:
[
[0,0,0,0],
[0,4,5,0],
[0,3,1,0]
]
做题思路
1. 首次提交踩的坑:
直接一次遍历二维数组,将数组中为0的元素所在行及所在列全置为零,没有考虑到新生成的0元素是不在需要置换范围内的。
2. 正确思路:
首先进行一次对二维数组的遍历,将所有0元素所在行及所在列都标记为true(即需要置换为0);再一次遍历二维数组,遇到所在行或所在列被标记为true的元素都置为0。
代码
class Solution {
public void setZeroes(int[][] matrix) {
int row=matrix.length;
int col=matrix[0].length;
boolean[] rows=new boolean[row]; //标记所在行是否需要进行置零
boolean[] cols=new boolean[col]; //标记所在列是否需要进行置零
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(matrix[i][j]==0){
rows[i]=true; //将元素所在行标记为true
cols[j]=true; //将元素所在列标记为true
}
}
}
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(rows[i]||cols[j]){ //若所在行或所在列被标记为true则将该元素置零
matrix[i][j]=0;
}
}
}
}
}