C++ 在二维矩阵中查找最大0数的行 问题
给定一个2D 0/1矩阵,找到最大数为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)。) 如果保证每行中的所有
0
s的行
例子
1111100011111110
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
,请向左移动光标。否则,向下移动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