Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在二维矩阵中查找最大0数的行 问题_C++_C_Algorithm_Matrix - Fatal编程技术网

C++ 在二维矩阵中查找最大0数的行 问题

C++ 在二维矩阵中查找最大0数的行 问题,c++,c,algorithm,matrix,C++,C,Algorithm,Matrix,给定一个2D 0/1矩阵,找到最大数为0s的行 例子 11111000 11111110 11100000 11000000 11110000 输出 11000000 我的想法 如果每个0s行是连续的,我们可以从两端扫描每一行。常识是用O(n^2)扫描 是否有任何O(n)解决方案?正如@amit所说: 扫描矩阵被认为是O(n)。标准的大O表示法代表运行时和输入大小之间的关系。由于输入的大小为#行*#列,因此应将此数字视为n,而不是#行 因此,这是您可以得到的O(n)。) 如果保证每行中的所有

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

例子 11111000
11111110
11100000
11000000
11110000

输出 11000000


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

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

正如@amit所说:

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

因此,这是您可以得到的
O(n)
。)


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

  • 将光标放在
    (len,0)
  • 如果光标左侧的值为
    0
    ,请向左移动光标。否则,向下移动
  • 如果到达最下面一行,则终止。否则,请转至步骤2
  • std::向量矩阵;
    std::vector::迭代器y=matrix.begin();
    for(std::string::reverse_迭代器x=(*y).rbegin();x
    如果每一行都像1…10…0,那么可以对每一行的前零进行二进制搜索

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

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

    您可以在
    O(n)
    中执行此操作,如下所示:

    A[i][j]
    开始,使用
    i=0和j=No\u列-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"
    
    设R为行数
    设C为列数
    设i=0
    设j=C-1
    设max1Row=0
    while(i=0)
    if(矩阵[i][j]==0)
    j--
    max1Row=i
    其他的
    我++
    结束时
    打印“最大0=j”
    打印“最大为0的行号=最大为1行”
    
    对于给定的样本集(都以111开头,以000结尾,没有1和0的混合),可以简单地通过测试a&(a xor B)在一次过程中搜索该集,以测试是否有比前一行更多或更少的零——这是一个O(n)的循环……

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

    注意:在C中使用assmbly inc或++变量时,添加一个非常快++

    编辑:这是另一个想法。如果您确实只需要不超过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设置为int01
    对于I=1到n-1
    带intI+1的异或intI,将结果存储在tmpX中
    和带有intI的tmpX,将结果存储在tmpM中
    和具有intI+1的tmpX,将结果存储在tmpN中
    如果(tmpN
    tmpA现在应该保留(最后)行中最少的零

    干杯,
    G.</P> C还是C++?提示:选择C++!只要把它称为mxm矩阵,让n=m^2,那么它就是O(n),没有
    O(n)
    解。有一种方法可以“优化”它,但是“优化”只会在特定的场景中有所帮助,实际上会在其他场景中使情况变得更糟。@munito语言不可知!在您的示例中,所有行都以1开头,以0结尾,0后面永远不会跟1。这是二维矩阵的一个属性吗?+1,但是,正如我在上面所评论的,这是
    O(sqrt(n))
    。在处理矩阵时,对于大O符号,通常是
    #rows*#cols==n
    [因为输入的大小是
    #rows*#cols
    ,而
    n
    代表输入的大小]。@Curi0us7-Yup;不过,直到读到阿米特的评论,我才意识到这一点。
               0, keep moving to the left by doing j--
    A[i][j] = 
               1, move down to the next row by doing i++
    
    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"
    
    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