给定m和n矩阵0和1,如果元素为0,则将其整个行和列设置为0
如何在没有任何额外空间复杂性的情况下解决此问题
答案 0 :(得分:1)
使用第一行和第一列作为标记列表,分别标记相应的列和行。总的来说,m+n-1
矩阵可以使用mxn
个标记,只需要一个 额外的 标记来标记{{1行或1st
列(它由程序员选择,虽然没有区别)。
1st
然后遍历矩阵,如果列或行中的任何元素为0,则标记标记。
然后,一旦完成遍历,使用这些标志来决定哪个列或行将填充所有0。
答案 1 :(得分: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的所有行和列索引;并且只将它们归零一次;但这意味着:为这些索引分配空间。
答案 2 :(得分:0)
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;
}
}