Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in-place.
Example 1:
Input:
[
[1,1,1],
[1,0,1],
[1,1,1]
]
Output:
[
[1,0,1],
[0,0,0],
[1,0,1]
]
Example 2:
Input:
[
[0,1,2,0],
[3,4,5,2],
[1,3,1,5]
]
Output:
[
[0,0,0,0],
[0,4,5,0],
[0,3,1,0]
]
Follow up:
A straight forward solution using O(mn) 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?
本题是如果出现0则整行整列都为0
一开始想直接循环,后来发现第一行和第一列如果有0直接循环则第一行第一列一开始就为0,后面便没法编列
所以将第一行与第一列设为标志
如果含有零 最后再把它整行整列化为零
直接从第二行第二列开始遍历
class Solution {
public void setZeroes(int[][] matrix) {
if(matrix == null){
return;
}
boolean firstRow = false;
boolean firstCol = false;
//判断第一列有无0
for(int i =0;i<matrix.length;i++){
if(matrix[i][0] == 0){
firstCol = true;
}
}
//判断第一行有无0
for(int j =0;j<matrix[0].length;j++){
if(matrix[0][j] == 0){
firstRow = true;
}
}
//除去第一行第一列再次判断第一列有无0,如果有则把第一行第一例而对应的数字
for(int i =1;i<matrix.length;i++){
for(int j =1;j<matrix[0].length;j++){
if(matrix[i][j]==0){
matrix[i][0] = 0;
matrix [0][j] =0;
}
}
}
//遍历如果第一行/列 为零则整行/列 为0
for(int i =1;i<matrix.length;i++){
for(int j =1;j<matrix[0].length;j++){
if(matrix[i][0]==0 ||matrix[0][j]==0){
matrix[i][j] = 0;
}
}
}
//把第一行的0填上
if(firstRow == true){
for(int i =0;i<matrix[0].length;i++){
matrix[0][i] = 0;
}
}
if(firstCol == true){
for(int i =0;i<matrix.length;i++){
matrix[i][0] = 0;
}
}
}
}