给定2D 0/1矩阵,找到最大数量为
0
s的行。
11111000
11111110个
11100000个
11000000个
11110000
11000000
如果每个0
行是连续的,我们可以从每一行的两端扫描。常识说用O(n^2)
进行扫描。
是否有O(n)
个解决方案?
答案 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))
中执行此操作。
(len, 0)
0
,请向左移动光标。否则,请将其向下移动。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。