您的位置:首页 > 其它

LeetCode 73. Set Matrix Zeroes

2016-02-05 17:17 447 查看
按照题目肯定是需要分配空间来标示某行某列是否需要全设为0。

1.最简单的方法,空间是O(m+n):分配m+n个bool空间,第一次遍历矩阵,若matrix[i][j] == 0,则把第i行和第j列设为true,在第二次遍历矩阵时,查询第i行第j列是否都是true,然后再决定matrix[i][j]是否设为0。

2.空间是O(1),只需要2个bool值bRow和bCol:用来指示第0行和第0列上是否有0,这种方法把0行0列和剩下的(m-1)*(n-1)矩阵区分开来,0行0列用来标示第i行第j列是否是0,和第一种类似,若为0,则matrix[0][j]和matrix[i][0]设为0。在第二次遍历时,查询matrix[0][j]和matrix[i][0]来对matrix[i][j]操作,注意:要把0行0列去掉,防止影响(m-1)*(n-1)矩阵,毕竟0行0列已经改变数值了,同时,遍历要从m-1和n-1而不是1行1列开始,因为矩阵可能没有1行1列。最后再对0行0列进行操作。

代码如下:

<span style="font-size:24px;">class Solution {
public:
void setZeroes(vector<vector<int>>& matrix)
{
bool bRow = false;
bool bCol = false;
int m = matrix.size();
int n = matrix[0].size();

for (int i = 0; i < m; ++i)
{
for (int j = 0; j < n; ++j)
{
if (0 == matrix[i][j])
{
if (0 == i && !bRow)
{
bRow = true;
}
else if (0 == j && !bCol)
{
bCol = true;
}
else if (0 != i && 0 != j)
{
matrix[0][j] = 0;
matrix[i][0] = 0;
}
}
}
}

for (int i = m-1; i >= 0; --i)
{
for (int j = n-1; j >= 0; --j)
{
if (0 == matrix[0][j] || 0 == matrix[i][0])
{
matrix[i][j] = 0;

4000
}
}
}

if (bRow)
{
for (int j = 0; j < n; ++j)
{
matrix[0][j] = 0;
}
}

if (bCol)
{
for (int i = 0; i < m; ++i)
{
matrix[i][0] = 0;
}
}
}
};</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  LeetCode