题目描述:
Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
Follow up:
Did you use extra space?
A straight forward solution using O(m n) space is probably a bad idea.
A simple improvement uses O(m + n) space, but still not the best solution.
Could you devise a constant space solution?
思路解析:
- 题意:矩阵的第i行和第j列的元素为0,那么第i行全部设置为0,第j列全部设置为0
- 首先记录矩阵的行和列.
- 然后先把第一行和第一列记录下是否要置为0,可以用Boolean类型的记录
- 检查每个元素,除了第一行和第一列,只要为0,就让第一行和第一列记录一下置0情况
- 然后遍历每个元素,根据第一行和第一列的记录情况,执行置0操作
- 最后再根据第一行和第一列的置0情况,把第一行和第一列置0,如果不需要就保持原来的样子就可以了
- 当时有点疑问,如果第j列只有第0行的元素是0,其他都是1的话,第j列那就不置0了吗,那不就错了吗?后来在提示下,他本来就是0了,已经记录下了,所以他不用修改为0,就是0 了,所以第j列还是会置0的。为自己智商捉急。。。。。
代码:
public class Solution {
public void setZeroes(int[][] matrix) {
int rownum = matrix.length;
if(rownum==0) return ;
int colnum = matrix[0].length;
if(colnum==0) return;
boolean hasZeroFirstRow = false,hasZeroFirstColumn=false;
//遍历第0列的所有行,只要有一个是0,第一列就是0,先记录下
for(int i=0;i<rownum;i++){
if(matrix[i][0]==0){
hasZeroFirstColumn = true;
break;
}
}
//遍历第0行的每个列,只要有一个是0,第一行就是0,先记录下
for(int j=0;j<colnum;j++){
if(matrix[0][j]==0){
hasZeroFirstRow = true;
break;
}
}
//matrix[0][j]是记录第j列是可以置0的;matrix[i][0]是记录第i行是可以置0的
for(int i=1;i<rownum;i++){
for(int j=1;j<colnum;j++){
if(matrix[i][j]==0){
matrix[0][j]=0;
matrix[i][0]=0;
}
}
}
//把对应的行和列置0,除了第一行和第一列
for(int i=1;i<rownum;i++){
for(int j=1;j<colnum;j++){
if(matrix[i][0]==0||matrix[0][j]==0){
matrix[i][j]=0;
}
}
}
//把第一行置0
if(hasZeroFirstRow){
for(int j=0;j<colnum;j++){
matrix[0][j]=0;
}
}
//把第一列置0
if(hasZeroFirstColumn){
for(int i=0;i<rownum;i++){
matrix[i][0]=0;
}
}
}
}
参考:https://blog.youkuaiyun.com/linhuanmars/article/details/24066199/