题目
若M*N的矩阵中某个元素为0,则将其所在的行列清零
要求:空间复杂度是O(1)
算法
- 找出第一个0元素
- 然后利用第一个0元素的行列来记录分布其余零元素的列行
- 根据第一个0元素所在的行列的记录情况,清零
(参看进军硅谷P96页)
1 | 0 | 3 | 4 |
---|---|---|---|
5 | 6 | 0 | 8 |
9 | 10 | 11 | 12 |
=>记录
1 | 0 | 0 | 4 |
---|---|---|---|
5 | 0 | 0 | 8 |
9 | 10 | 11 | 12 |
=>结果
0 | 0 | 0 | 0 |
---|---|---|---|
0 | 0 | 0 | 0 |
9 | 0 | 0 | 12 |
代码
import java.util.*;
class Solution{
public static void setzores(int[][] matrix){
int m=matrix.length;
if(m==0) return;
int n=matrix[0].length;
int x=-1,y=-1;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++){
if(matrix[i][j]==0){
//找到第一个0元素
x=i; //记录行
y=j; //记录列
}else{
//在第一个0元素所在的行列设置0(也就是记录其他0元素的位置)
matrix[x][j]=0;
matrix[i][y]=0;
}
}
//如果找不到0则返回
if(x==-1 || y==-1) return;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
if(matrix[x][j]==0 || matrix[i][y]==0)
matrix[i][j]=0;
}