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,将结果保存在布尔值col和row中,然后从(1,1)开始遍历数组,如果为零,则把那一行和那一列的第一位置零,表示这一行和这一列需要置零。遍历完后再根据首行后首列是否为零来处理数组中的值,最后还要根据col和row判断是否要将第一行和第一列置0.
public void setZeroes(int[][] matrix) {
if(matrix==null||matrix.length==0)
return;
int n=matrix.length;
int m=matrix[0].length;
boolean col=false;
boolean row=false;
for(int i=0;i<n;i++)
if(matrix[i][0]==0)
col=true;
for(int i=0;i<m;i++)
if(matrix[0][i]==0)
row=true;
for(int i=1;i<n;i++)
for(int j=1;j<m;j++)
if(matrix[i][j]==0)
{
matrix[i][0]=0;
matrix[0][j]=0;
}
for(int i=1;i<n;i++)
{
if(matrix[i][0]==0)
Arrays.fill(matrix[i], 0);
}
for(int i=1;i<m;i++)
if(matrix[0][i]==0)
for(int j=1;j<n;j++)
matrix[j][i]=0;
if(row)
Arrays.fill(matrix[0], 0);
if(col)
for(int i=0;i<n;i++)
matrix[i][0]=0;
}
Runtime: 0 ms, faster than 100.00% of Java online submissions for Set Matrix Zeroes.
Memory Usage: 42.2 MB, less than 85.69% of Java online submissions for Set Matrix Zeroes.
解法二
这种方法更为简单,用k记录第一行中是否有0,遍历数组从(1,0)开始,纸条过第一行但不跳过第一列,如果数据为零,则令该数所在行和所在列的第一个数字为零。然后再次遍历数组i从1开始,j从m-1开始,倒过来处理,因为j如果从0开始处理 那么同一列后面的数据将可能错误的设置为0.
public void setZeroes(int[][] matrix) {
if(matrix==null||matrix.length==0)
return;
int n=matrix.length;
int m=matrix[0].length;
int k=0;
while(k<m&&matrix[0][k]!=0)
++k;
for(int i=1;i<n;i++)
for(int j=0;j<m;j++)
if(matrix[i][j]==0)
matrix[i][0]=matrix[0][j]=0;
for(int i=1;i<n;i++)
for(int j=m-1;j>=0;j--)
if(matrix[0][j]==0||matrix[i][0]==0)
matrix[i][j]=0;
if(k<m)
Arrays.fill(matrix[0], 0);
}
Runtime: 1 ms, faster than 95.61% of Java online submissions for Set Matrix Zeroes.
Memory Usage: 45.7 MB, less than 49.35% of Java online submissions for Set Matrix Zeroes.
python
class Solution:
def setZeroes(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
if not matrix:
return
n,m,k=len(matrix),len(matrix[0]),0
while k<m and matrix[0][k]:
k=k+1
for i in range(1,n):
for j in range(m):
if not matrix[i][j]:
matrix[i][0]=matrix[0][j]=0
for i in range(1,n):
for j in range(m-1,-1,-1):
if not matrix[i][0] or not matrix[0][j]:
matrix[i][j]=0
if k<m:
matrix[0]=[0]*m