
1.暴力法
这个题暴力法也很容易理解,直接双层for循环找到0的位置,然后在双层for循环置零。
2.标记法(空间换时间)
思路
(1)设计两个行数组与列数组,标记遍历每个0所在行与列。
(2)然后用标记数组作为判断条件,再双层for循环判断该位置是否为0.判断方法是该行或该列是否被标记。
具体代码
java
class Solution {
public void setZeroes(int[][] matrix) {
int m=matrix.length;
int n=matrix[0].length;
int[] hang =new int[m];
int[] lie = new int[n];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(matrix[i][j]==0){
hang[i]=1;
lie[j]=1;
}
}
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(hang[i]==1 || lie[j]==1){
matrix[i][j]=0;
}
}
}
}
}
3.优化标记法 (空间复杂度O(1))
思路
(1)为了不额外创建数组,将第一行与第一列作为标记数组,但是要提前将第一行与第一列是否为存在0先进行标记。其余思路与方法2一致。
具体代码
java
class Solution {
public void setZeroes(int[][] matrix) {
int hang_f=0;
int lie_f=0;
int m=matrix.length;
int n=matrix[0].length;
for(int i=0;i<n;i++){
if(matrix[0][i]==0){
hang_f=1;
break;
}
}
for(int i=0;i<m;i++){
if(matrix[i][0]==0){
lie_f=1;
break;
}
}
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
if(matrix[i][j]==0){
matrix[0][j]=0;
matrix[i][0]=0;
}
}
}
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
if(matrix[0][j]==0 || matrix[i][0]==0){
matrix[i][j]=0;
}
}
}
if(hang_f==1){
for(int i=0;i<n;i++){
matrix[0][i]=0;
}
}
if(lie_f==1){
for(int i=0;i<m;i++){
matrix[i][0]=0;
}
}
}
}