题目链接:
题目描述:
思路:
只需要两个元素分别记录行和列就行
第一次遍历,找到为0的元素,标注行和列是true
第一次遍历,如果行或列是true,把这行元素该为0
上面是用了两个额外的数组做标记,实际上可以用矩阵本身的行和列做标记,就用第一行和第一列
注意:第一列的0表示某一行有0
第一行的0表示某一列有0
然后再次遍历,如果某个元素所在位置的首行或首列为0,就把这个元素变为0,这里不能遍历到首列,但是可以遍历到首行,因为首行元素是否变0,要看首列元素里面第一个元素,
这里需要注意,因为首行首列做过修改,所以我们再次遍历的时候要从后往前遍历,避免前面修改得到的0干扰
而且,由于首列的元素被修改成0,还需要看原始首列是否有0,有0的话做个标记,在遍历的时候把首列元素设为0
实现代码:
class Solution {
public void setZeroes(int[][] matrix) {
int row = matrix.length;
int col = matrix[0].length;
boolean[] a = new boolean[row];
boolean[] b = new boolean[col];
for(int i = 0 ; i < row; i++){
for(int j = 0; j < col; j++){
if(matrix[i][j] == 0){
a[i] = b[j] = true;
}
}
}
for(int i = 0 ; i < row; i++){
for(int j = 0; j < col; j++){
if(a[i] || b[j]){
matrix[i][j] = 0;
}
}
}
}
}
class Solution {
public void setZeroes(int[][] matrix) {
int row = matrix.length;
int col = matrix[0].length;
boolean flagcol0 = false;
for(int i = 0 ; i < row; i++){
if(matrix[i][0]==0){
flagcol0 = true;
}
for(int j = 1; j < col; j++){
if(matrix[i][j] == 0){
matrix[i][0] = matrix[0][j] = 0;
}
}
}
for(int i = row - 1 ; i >= 0; i--){
for(int j = col - 1; j >= 1; j--){
if(matrix[i][0] == 0 || matrix[0][j] == 0){
matrix[i][j] = 0;
}
}
//看原始首列是否存在0,存在就变0
if(flagcol0) matrix[i][0] = 0;
}
}
}