您的位置:首页 > 其它

Set Matrix Zeroes

2015-07-17 09:40 239 查看
Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.

思路:其实主要就是找出哪一行哪一列应该被设置为0,如果用两个list来记录哪些行和哪些列应该被设置为0,很容易就可以写出算法。但是题目要求空间复杂度为o(1),可利用以第一行和第一列来记录哪些行和哪些列应该被设置为0。

首先遍历第一行和第一列,记录第一行和第一列中是否存在0

从第二行第二列开始遍历,如果遇到当前数字a[i][j]为0(其中i>=1且j>=1),就标记a[0][j]为0,代表第j列应该被设置为0,同理标记a[i][0]为0,代表第i行应该被设置为0。不用觉得破坏了第一行或者第一列的数据,因为这些数字本该是要被设置为0的

遍历完成后,再次遍历第一行和第一列,遇到当前数字为0将对应的行或者列设置为0

但是要注意的是你无法知道第一行或者第一列中的0是本来有的,还是遍历的过程中标记的,不过还好最开始的时候你先遍历过第一行和第一列,已经知道了第一行或者第一列中是否存在0。如果第一行中存在0,那就将第一行全部置为0,如果第一列存在0,那就将第一列全部置为0

注意:不能直接去矩阵遍历,然后遇到为0的数字,就将当前列和当前行全部置为0,这样会影响下次遍历到当前行或者当前列中的数字,因为你无法判断当前的数字的0是你置为0的还是本来就是0.

public class Solution {
public void setZeroes(int[][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
boolean firstrow=false;
boolean firstcol=false;
for(int j=0;j<n;j++)
{
if(matrix[0][j]==0)
{  firstrow=true;
break;
}
}
for(int i=0;i<m;i++)
{
if(matrix[i][0]==0)
{  firstcol=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;
matrix[0][j]=0;
}
}
}
for(int j=1;j<n;j++)
{
if(matrix[0][j]==0)
{
for(int i=1;i<m;i++)
matrix[i][j]=0;
}
}
for(int i=1;i<m;i++)
{
if(matrix[i][0]==0)
{
for(int j=1;j<n;j++)
matrix[i][j]=0;
}
}
if(firstrow)
{
for(int j=0;j<n;j++)
matrix[0][j]=0;
}
if(firstcol)
{
for(int i=0;i<m;i++)
matrix[i][0]=0;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: