查找二维矩阵中最大 0 的行
Find the row(s) with maximum number of 0s in a 2-d matrix
>问题
给定一个 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))
中执行此操作。
- 将光标放在
(len, 0)
上 - 如果光标左侧的值为
0
,则向左移动光标。否则,将其向下移动。 - 如果到达底行,则终止。否则,请转到步骤 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.
- C++ 中的二维整数数组,每行中的元素数量不均匀
- 绘制二维矩阵的行和列
- 在 c++ 中分配布尔值的动态二维数组时超出内存限制
- 如何将 50 行和 50 列的二维数组编码为一个为元素随机分配星号的函数?
- 有效地从文本文件中读取带有字符串索引的大型二维数组(矩阵)
- C++ ->尝试逐字阅读一行文本。如何使指针等效于用于存储输入的当前二维数组
- 如何在C++中将字符串的动态二维数组作为参数传递
- 寻找小集合的刚性二维变换
- C/C++中固定长度实输入数据的高效二维FFT
- 正在删除模板化的C++二维数组
- 私有属性C++上的动态二维数组
- 填充对象的C++二维数组
- 我无法让我的程序正确读取输入文件中的值(二维数组)
- 具有可变大小行的C++二维数组
- 可调整大小的动态二维阵列的更好解决方案
- 初始化具有特定值的可变二维数组
- 用双指针创建的C++二维数组
- OpenCV Mat到alglib的真实二维数组转换
- 定义boost::dynamic_bitset的(一/二)维数组
- 从头文件 c++ 内的常量二维数组行分配常量 1D 数组