题目描述:
给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 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]
]
进阶:
- 一个直接的解决方案是使用 O(mn) 的额外空间,但这并不是一个好的解决方案。
- 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
- 你能想出一个常数空间的解决方案吗?
分析:空间复杂度为O(1),解释见代码部分
代码:
class Solution {
public void setZeroes(int[][] matrix) {
int row=matrix.length;
int col=matrix[0].length;
/*记录第1列中是否有0,如果有0,第一列应该全赋值为0
(赋值为0的操作在54行代码会进行),这里只进行记录。*/
boolean first_col_has_zero=false;
for(int i=0;i<row;i++){
if(matrix[i][0]==0){
first_col_has_zero=true;
}
for(int j=1;j<col;j++){//从每行第2列开始,因为第1列用来做标志位
if(matrix[i][j]==0){
matrix[i][0]=0;
matrix[0][j]=0;
}
}
}
/*处理matrix[1][1]到matrix[row-1][col-1]之间的元素,该赋0的赋0:
{matrix[1][1]......................................
matrix[2][1]......................................
..................................................
..................................................
........... ..................matrix[row-1][col-1]}
*/
for(int i=1;i<row;i++){
for(int j=1;j<col;j++){
if(matrix[i][0]==0||matrix[0][j]==0){
matrix[i][j]=0;
}
}
}
/*matrix[0][0]==0有两种情况:
第一种是遍历了第一行元素matrix[0][1]~matrix[0][col],如果其中有元素等于0,
则matrix[0][0]被赋值为0;
还有一种情况就是matrix[0][0]本身就是0。
不管哪种情况,最后第一行元素都要赋值为0,所以有以下语句
*/
if(matrix[0][0]==0){
for(int j=1;j<col;j++){
matrix[0][j]=0;
}
}
/*
first_col_has_zero为true说明第一列中matrix[0][0]~matrix[row][0]有元素为0,
不管那个元素为零,第一列都要被赋值为0。
值得注意的是,这里的0是未修改前的0,因为第一行和第一列作为matrix[i][j]的标志位,
所以第一行第一列会根据matrix[i][j]是否为0来决定是否修改为0
*/
if(first_col_has_zero){
for(int i=0;i<row;i++){
matrix[i][0]=0;
}
}
}
}