题目
https://leetcode-cn.com/problems/set-matrix-zeroes/
分析
用第一行和第一列来标记每行/每列是否存在0。但这样会覆盖第一行第一列本身的0,所以我们用两个常量来标记第一行和第一列本身是否有0;
代码
class Solution {
public void setZeroes(int[][] matrix) {
int m=matrix.length,n=matrix[0].length;
boolean f1=false,f2=false;
//第一行是否有0
for(int j=0;j<n;j++){
if(matrix[0][j]==0){
f1=true;
break;
}
}
//第一列是否有0
for(int i=0;i<m;i++){
if(matrix[i][0]==0){
f2=true;
break;
}
}
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
if(matrix[i][j]==0){
matrix[i][0]=0;//第一列的这个位置,代表第i行
matrix[0][j]=0;//第一行的这个位置,代表第j列
}
}
}
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
if(matrix[i][0]==0||matrix[0][j]==0){
matrix[i][j]=0;
}
}
}
if(f1){
for(int j=0;j<n;j++){
matrix[0][j]=0;
}
}
if(f2){
for(int i=0;i<m;i++){
matrix[i][0]=0;
}
}
}
}
复杂度
时间复杂度:O(mn),其中 m 是矩阵的行数,n 是矩阵的列数。我们至多只需要遍历该矩阵两次。
空间复杂度:O(1),我们只需要常数空间存储若干变量。