给定一个按行排序的布尔矩阵。返回最大数为1的行

时间:2013-07-26 05:11:45

标签: arrays algorithm matrix binary binary-matrix

我遇到了一个Matrices的问题但是试图找出最佳解决方案。 问题陈述是问题主题本身。 进一步见下文

Example
Input matrix

  0 1 1 1
  0 0 1 1
  1 1 1 1  // this row has maximum 1s
  0 0 0 0

Output: 2

我的解决方案:现在,由于行已排序,我考虑在第一次出现1的每一行中执行二进制搜索,然后计数为1将为total number of columns minus index of 1st 1

这将在O(m*logn)中执行,但我很想知道逻辑是否可以在线性时间内完成。

谢谢!

2 个答案:

答案 0 :(得分:8)

在右上角启动光标。在每一行中,向左走,直到到达行中的最后一行。然后下台。如果您下降并且光标指向0,则再次下降。永远不要走吧您正在寻找左侧最远1行的行,因此您永远不需要向右看。运行时间为O(n + m),因为你经过每一行,踩下m次,最多总共剩下n步。这里有一些伪代码,假设矩阵是一个列表列表:

bestrow = 0
leftmost = matrix.width

for i = matrix.height to 0:
    row = matrix[i]
    while row[leftmost - 1] == 1:
        leftmost--
        bestrow = i

return bestrow

如果您按字面翻译代码,则可能会遇到所有0的矩阵问题,或者某些行是否全部为1。这些很容易处理,伪代码的目的只是传达通用算法。

答案 1 :(得分:0)

此问题的解决方案取决于每行中的元素数量和列数。 这是一种方法。

第1步: 简单做一个二进制&&对每列中的所有元素进行操作,直到得到true为止,这意味着我们找到了一个至少有一列的列。这需要最多n步,其中n是列数。

第2步: 现在,在该列中搜索从上到下的一个,它为您提供最大数量为1的行。这需要最多m步。其中m是行数 总的来说,它需要O(m + n)步

它还可以帮助您找到具有相同属性的多行(