【发布时间】:2016-09-03 06:10:50
【问题描述】:
给定一个由 0 和 1 组成的 m x n 矩阵,如果元素为 0,则将其整行整列设置为 0
我们怎样才能在没有额外空间复杂度的情况下解决这个问题
【问题讨论】:
标签: algorithm matrix data-structures
给定一个由 0 和 1 组成的 m x n 矩阵,如果元素为 0,则将其整行整列设置为 0
我们怎样才能在没有额外空间复杂度的情况下解决这个问题
【问题讨论】:
标签: algorithm matrix data-structures
使用第一行和第一列作为标志列表,分别标记相应的列和行。所以总的来说,mxn 矩阵将有 m+n-1 标志可供您使用,只需要一个 extra 标志来标记1st 行或@987654324 @ 列(由程序员选择,但没有区别)。
[C0/R0] C1 C2 ... Cn-1
R1
R2
.
Rm-1
Take one extra flag for [R0/C0].
然后遍历矩阵,如果列或行中的任何元素为0,则标记标志。
然后,一旦您完成遍历,使用这些标志来决定哪一列或哪一行将被全 0 填充。
【讨论】:
一种简单的方法是简单地迭代整个矩阵:
for i in 1 to number of rows
for j in 1 to number of columns
if n(i,j) == 0:
for all n(i, 1 to number of columns): set to 0
for all n(1 to number of rows, j): set to 0
除了两个循环计数器之外,这不需要任何额外的空间。当然,关于性能是 O(可怕),但你没有问这个。
为了提高性能,您可以收集所有包含 1 的行和列索引;并将它们归零一次;但这意味着:为这些索引分配空间。
【讨论】:
rowZero 和colZero
public static void ZeroMatrixResultBitVector(int[][] matrix)
{
bool rowZero = false;
bool colZero = false;
// check if first row has zero
for (int i = 0; i < matrix.Length; i++)
{
if (matrix[i][0] == 0)
{
colZero = true;
break;
}
}
// check if first column is zero
for (int j = 0; j < matrix[0].Length; j++)
{
if (matrix[0][j] == 0)
{
rowZero = true;
break;
}
}
//if the above hasn't been true then we will update the first column/row later
for (int i = 1; i < matrix.Length; i++)
{
for (int j = 1; j < matrix[0].Length; j++)
{
if (matrix[i][j] == 0)
{
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
//nullify all row related records
for (int i = 1; i < matrix.Length; i++)
{
if (matrix[i][0] == 0)
{
nullifyRow(matrix, i);
}
}
//nullify all column related records
for (int j = 1; j < matrix[0].Length; j++)
{
if (matrix[0][j] == 0)
{
nullifyColumn(matrix, j);
}
}
if (rowZero)
{
nullifyRow(matrix, 0);
}
if (colZero)
{
nullifyColumn(matrix, 0);
}
}
使行无效的功能:
private static void nullifyRow(int[][] matrix, int row)
{
for (int j = 0; j < matrix[0].Length; j++)
{
matrix[row][j] = 0;
}
}
使列无效的功能:
private static void nullifyColumn(int[][] matrix, int column)
{
for (int i = 0; i < matrix[0].Length; i++)
{
matrix[i][column] = 0;
}
}
【讨论】: