可以用两个数组记录每一行 每一列是否有存在0 但是注意在记录的时候不能同时set 这样原来不是0的也要被set成0 最后就全变成0
然后再用一次扫描 假如这一行或者这一列有是0的 就把这一位set
public class Solution {
public void setZeroes(int[][] matrix) {
int col = matrix[0].length;
int row = matrix.length;
int [] rowArr = new int [ row ];
int [] colArr = new int [ col ];
for ( int i = 0; i < row; i ++ ){
for ( int j = 0; j < col; j ++ ){
if ( matrix[i][j] == 0 ){
rowArr[i] = 1;
colArr[j] = 1;
}
}
}
for ( int i = 0; i < row; i ++ ){
for ( int j = 0; j < col; j ++ ){
if ( rowArr[i] == 1 || colArr[j] == 1)
matrix[i][j] = 0;
}
}
}
}还有一种省空间的方法 就是把那两个记录数组记录在每一行每一列的第一个数字那里
注意 首先左上角的那个既代表第一行又代表第一列 所以需要多用一个数字单独记录
并且最后set的过程要从后面来 否则第一行第一列就会被破坏了
void setZeroes(vector<vector<int> > &matrix) {
int col0 = 1, rows = matrix.size(), cols = matrix[0].size();
for (int i = 0; i < rows; i++) {
if (matrix[i][0] == 0) col0 = 0;
for (int j = 1; j < cols; j++)
if (matrix[i][j] == 0)
matrix[i][0] = matrix[0][j] = 0;
}
for (int i = rows - 1; i >= 0; i--) {
for (int j = cols - 1; j >= 1; j--)
if (matrix[i][0] == 0 || matrix[0][j] == 0)
matrix[i][j] = 0;
if (col0 == 0) matrix[i][0] = 0;
}
}
426

被折叠的 条评论
为什么被折叠?



