LeetCode-0108.零矩阵

原题:编写一种算法,若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]
]


 

如果使用双循环直接遍历,那么将会得到得到一个错误的结果,扫描到0、将其他位数变为0之后,原本为0的位置状态改变了,导致更多位置变成0,随机更多行、列被置为0,。

所以思路应该是这样的,既然只要有一行或者有一列的其中一个一个位置为0,整行就为0。那么就原本的0具体在哪个位置就无所谓了,我们也不需要去找为0的位置。这样,就把是否置0的条件变成了:该行是否包含0。如果是,则直接整行置0;如果不是,则不操作。那么如何查到该行是否包含0?现在就可以拉出双循环出来了。把行、列分开来,如果第 n 行存在0,那么row[ n ] 为true;如果第 m 行存在0,那么row[ m ] 为true,两个数组分别记录了二维数组中,行、列各自包含0的位置记录,再重新使用双循环,将为true的行、列的元素统统置为0,即可。


class Solution {
    public void setZeroes(int[][] matrix) {
        boolean[] row = new boolean[matrix.length];
        boolean[] col = new boolean[matrix[0].length];
        for(int i=0; i<matrix.length; i++){
            for(int j=0; j<matrix[0].length; j++){
                if(0 == matrix[i][j]){
                    row[i] = true;
                    col[j] = true;
                }
            }
        }

        for(int i=0; i<matrix.length; i++){
            for(int j=0; j<matrix[0].length; j++){
                if(row[i] || col[j]){
                    matrix[i][j] = 0;
                }
            }
        }
    }
}

 

posted @ 2022-01-05 21:19  我永远喜欢石原里美  阅读(68)  评论(0)    收藏  举报