在时间复杂度要求下搜索矩阵中的首次出现



我需要为一个算法编写一个psuedo代码,该算法获得一个矩阵(n x m(作为输入,并输出0 第一次出现的行索引

我应该描述两种算法,其中一种在O(mlogn(中执行,另一种在0(m+n(中执行

矩阵的特殊属性:
矩阵仅由0和1组成。
一旦输入零值,该单元格下面的所有同一列也需要为零。

有效输入示例:

1 1 1 1 1 1
1 0 1 1 1 1  
1 0 0 1 0 1
1 0 0 0 0 1
0 0 0 0 0 0

输出应为:1

编辑:我用O(mlogn(想出了一个算法。

第一个算法O(m*log(n((

在列中,值按降序排列。这意味着您可以通过在列中使用二进制搜索来查找O(log(n))中的第一个0

m列要搜索。这导致O(m*log(n))在所有列中搜索它们的第一个0。在这些m结果中找到第一个0是由先前搜索的O(m*log(n))支配的O(m)

第二算法O(m+n(

第二种算法从CCD_ 10处的小区开始。对于每一列,从最后一列开始,当我们在具有0的单元格上时,我们向上。当我们点击1时,我们会转到上一列。

i <- n
j <- m
r <- (-1, -1)
while (j >= 0):
if M(i,j) == 1:
j <- j-1
continue
while (i >= 0 && M(i,j) == 0)
r <- (i,j)
i <- i-1

最后,结果在r中,或者根本没有结果,并且r = (-1,-1)

编辑:这个答案是针对旧问题的,该问题不包括矩阵的特殊属性


我认为在最坏的情况下,不可能想出一个比O(mn(性能更好的算法。

这里有一个简单的解决方案,它检查矩阵的每个元素。

def solve(mat, n, m):
for i in range(1, n):
for j in range(i, m):
if mat[i][j] == 0:
return i
return -1

在最坏的情况下(例如,当输入矩阵中没有0时(:

外部for循环将运行n次,对于每次迭代,内部for循环将执行m次。

因此,总的时间复杂度将是O(m*n(

最新更新