用于清空所有“坏”列和行的算法

时间:2016-05-15 22:13:27

标签: algorithm matrix time-complexity space-complexity

给定字节矩阵(所有值在内存中均为1位),如果其中至少有一个零,则将其称为原始列或“坏”列。查找算法,需要额外的O(1)内存。

我不知道如何在没有其他值(如-1或其他重复矩阵)的情况下执行此操作,以跟踪已找到的空值,并且不会将它们与我们填充的空值混淆。

2 个答案:

答案 0 :(得分:1)

假设A是提供给您的字节矩阵。此解决方案使用恒定的额外空间使用矩阵中的第一行和第一列作为标志。

只需要为row1增加一个标志(此处为r1)。

void setZeroes(vector<vector<int> > &A) {
    int m = A.size();
    int n = A[0].size();
    int r1 = 1; //row1
    for(int j = 0; j < n; j++){
        r1 *= A[0][j];
    }
    for(int i = 1; i < m; i++){ //first row skipped
        for(int j = 0; j < n; j++){
            A[0][j] *= A[i][j]; //Marking Colm
            A[i][0] *= A[i][j]; //Marking rows, skipping row#1
        }
    }
    for(int i = 1; i < m; i++){
        for(int j = 1; j < n; j++){
            A[i][j] = A[0][j] * A[i][0];
        }
    }
    //At last, update colm1.
    for(int j = 1; j < m; j++){
        A[j][0] *= A[0][0];
    }
    //At last, update row1.
    for(int j = 0; j < n; j++){
        A[0][j] *= r1;
    }
}

答案 1 :(得分:0)

该算法使用O(1)空间。以下是步骤:

  1. 查找包含所有1个值的第一行。如果没有这样的行,那么所有行都包含至少一个0,所以所有矩阵都应该变为0。将行索引保留在变量I中。

  2. 使用第I行作为标记来保持每列的值,即&整列,并存储在第I行。

  3. &除了I-th之外的每一行,并将值设置为该特定行的元素,即如果它至少有一个0 set整行为0,则取第1行,否则留下所有1的行,取第二行等我除了一行。
  4. &第I行到所有其他行,即所有A[i][j] &= A[I][j]i <> I的{​​{1}}行。
  5. 多数人都是!!!

    作为一个例子,我们有

    j=0,1,...,A[I].length-1
    1 1 1 0 1 0
    1 1 1 1 1 1
    1 0 1 1 1 1
    1 1 1 1 1 1

    在第一步之后,我们会发现I = 1是第二行。

    然后我们只改变第二行,矩阵将在第二步后变为(它将第一,第二,第四和最后一个元素更改为0,因为在该列中找到了0):

    0 1 1 1 1 0
    1 1 1 0 1 0
    0 0 1 0 1 0
    1 0 1 1 1 1
    1 1 1 1 1 1

    在第3步之后矩阵将成为(我们将0设置为至少有一个0除第2行之外的行):

    0 1 1 1 1 0
    0 0 0 0 0 0
    0 0 1 0 1 0
    0 0 0 0 0 0
    1 1 1 1 1 1

    在第4步之后,矩阵将变为跟随(我们正在通过所有列进行0 0 0 0 0 0操作):

    &
    0 0 0 0 0 0
    0 0 1 0 1 0
    0 0 0 0 0 0
    0 0 1 0 1 0

    这是我们正在寻找的矩阵。