在2-d矩阵中找到最大数为0的行

时间:2011-12-14 06:47:00

标签: c++ c algorithm matrix

问题

  

给定2D 0/1矩阵,找到最大数量为0 s的行。

实施例

  

11111000
  11111110个
  11100000个
  11000000个
  11110000

输出

  

11000000


我的想法

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

是否有O(n)个解决方案?

5 个答案:

答案 0 :(得分:1)

正如@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步。
  4. 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;
    }
    

答案 1 :(得分:1)

如果每一行都像1 .... 10 ... 0,你可以在每一行中搜索第一个零。

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

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

答案 2 :(得分:1)

您可以在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"

答案 3 :(得分:0)

使用给定的样本集(全部以111开头并以000结尾,没有1和0的混合),可以通过A&amp;(A xor B)的测试一次性搜索该集合以进行测试有比前一行更多或更少的零 - 这是一个O(n)....

的循环

答案 4 :(得分:0)

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

P.S。:在C ++中使用assmbly inc或++ Variable时,添加一个非常快

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

提取不同的位
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。