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; } } } } }
本文来自博客园,作者:我永远喜欢石原里美,转载请注明原文链接:https://www.cnblogs.com/yuan-zhou/p/15768904.html

浙公网安备 33010602011771号