题目
题解一:使用标记数组
public void setZeroes(int[][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
boolean[] row = new boolean[m];
boolean[] col = new boolean[n];
for(int i=0; i< m;i++){
for(int j = 0;j<n;j++){
if (matrix[i][j] == 0)
row[i]=col[j]=true;//将这一行和这一列的数据设为true
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (row[i] || col[j]) { //若行列任意为true 直接将对应的行列位置对应的值设为0
matrix[i][j] = 0;
}
}
}
}
题解二:使用临时数组,使用两个标记变量(使用0行0列作为临时标记数组)
参考链接:614,矩阵置零
-
先设置两个boolean 变量来判断第一行第一列临时数组是否存在0,存在0,说明第一列或第一行要全体置0
-
先遍历矩阵,将出现0的位置的第一行第一列置为0,后续可以根据第一行或列是否为0,来将对应的行或列全体置为0
-
根据第一行第一列的置0行列,来将全体矩阵对应的列和行置为0(不能动第一行,因为本身就是将第一行和列作为标0位,不能改变)
-
最后根据两个boolean来判断第一行或第一列是否出现了0,出现了就将第一行或第一列置为0(根据标志符处理第一行或列).
public void setZeroes(int[][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
boolean row = false;
boolean col = false;
for(int i = 0 ; i< m; i++){
for(int j = 0 ; j< n ; j++){
if(matrix[i][j]==0){
//如果第一行或者第一列本来就有0,就把他标记一
//下,最后再把第一行或者第一列全部置为0
if(i==0) row = true;
if(j==0) col = true;
//把最上面一行和最左边一列对应的位置标注为0
matrix[i][0] =0;
matrix[0][j] =0;
}
}
}
//把那些应该为0的行和列全部置为0
for(int i = 1 ; i< m; i++){
for(int j = 1 ; j< n ; j++){
if(matrix[i][0] == 0 || matrix[0][j] == 0)
matrix[i][j] = 0;
}
}
//如果第一行本来就有0,把第一行全部变为0
if(row){
for(int i = 0;i<n;i++){
matrix[0][i] =0;
}
}
//如果第一列本来就有0,把第一列全部变为0
if(col){
for(int i = 0;i<m;i++){
matrix[i][0] =0;
}
}
}