查找二维矩阵中最大 0 的行

Find the row(s) with maximum number of 0s in a 2-d matrix

本文关键字:的行 二维 查找      更新时间:2023-10-16

>问题

给定一个 2D 0/1 矩阵,找到具有最大 0 秒数的行。

11111000

11111110 11100000
11000000
11110000

输出

11000000


我的想法

如果每行0都是连续的,我们可以从两端扫描每一行。常识说要用O(n^2)扫描。

有没有O(n)解决方案?

如果每一行都像1....10...0,你可以在每行中对我进行二叉搜索。

那将是 O(n*lg(n((

对于任意矩阵,您必须检查每个单元格,因此它必须是 O(n^2(。

您可以在O(N)中按如下方式执行此操作:

A[i][j]开始,i=0 and j=No_of_columns-1.

           0, keep moving to the left by doing j--
A[i][j] = 
           1, move down to the next row by doing i++

当您到达最后一行或最后一列时,j 的值将是答案。

伪代码:

Let R be number of rows
Let C be number of columns
Let i = 0
Let j = C-1   
Let max1Row = 0
while ( i<R && j>=0 )
   if ( matrix[i][j] == 0 )
      j--
      max1Row = i
   else
      i++
end-while

print "Max 0's = j"
print "Row number with max 0's = max1Row"

正如@amit所说:

扫描矩阵被视为 O(n(。标准的大 O 表示法代表运行时和输入大小之间的关系。由于输入的大小为 #rows*#cols,因此应将此数字视为 n,而不是 #rows。

因此,这是你能得到的尽可能O(n)。 :)

std::vector<std::string> matrix;
std::vector<std::string>::iterator max = matrix.begin();
for(std::vector<std::string>::iterator i = matrix.begin(); i != matrix.end(); ++i)
{
    if(count_zeros(*i) > count_zeros(*max))
        max = i;
}

count_zeros()应该看起来像这样:

size_t count_zeros(std::string s)
{
    size_t count = 0;
    for(std::string::iterator i = s.begin(); i != s.end(); ++i)
        if(*i == '0')
            ++count;
    return i;
}

如果保证每行中的所有0都位于最右边,则可以在 O(sqrt(n)) 中执行此操作。

  1. 将光标放在(len, 0)
  2. 如果光标左侧的值为 0 ,则向左移动光标。否则,将其向下移动。
  3. 如果到达底行,则终止。否则,请转到步骤 2。
std::vector<std::string> matrix;
std::vector<std::string>::iterator y = matrix.begin();
for(std::string::reverse_iterator x = (*y).rbegin(); x < matrix.rend(); )
{
    if(*x != '0')
    {
        x -= (*y).rbegin();
        ++(*y);
        x += (*y).rbegin();
        continue;
    }
    ++x;
}

使用给定样本集(都以 111 开头,以 000 结尾,没有 1 和 0 的混合(,可以简单地在一次通过中搜索该集合,测试 A&(A xor B( 以测试是否有比前一行多或少的零 - 这是 O(n( 的循环......

这里有一个快速的解决方案,只有一个 if 或每行(不是每个元素(:由于您的矩阵只包含零和一,因此将每行的元素相加,然后返回最小值/最小值的索引。

PS:在C++中使用assmbly inc或++Variable时,添加它们非常快

编辑:这是另一个想法。如果你真的只需要不超过 64 列的 0/1 矩阵,你可以使用普通的无符号 64 个整数将它们实现为位矩阵。通过设置和删除相应的位,您可以定义条目(0 或 1(。效果:一个 o(n( 检查(如果我错了,请告诉我(,如下所示,其中 intXX 是 rowXX。第一个想法是通过异或提取不同的位

SET tmpA to int01
FOR I = 1 to n-1
  XOR intI with intI+1, store result in tmpX
  AND tmpX with intI, store result in tmpM
  AND tmpX with intI+1, store result in tmpN
  if (tmpN < tmpM)
    SET tmpA to intI+1
ENDFOR

tmpA 现在应该保留零最少的(最后一(行。

干杯G.