1-й алгоритм O (m * log (n))
Внутри столбца значения отсортированы в порядке убывания. Это означает, что вы можете найти первые 0
в O(log(n))
, используя двоичный поиск внутри столбца.
Есть m
столбцов для поиска. Это приводит к O(m*log(n))
для поиска во всех столбцах их первого 0
. Нахождение первого 0
среди этих m
результатов составляет O(m)
, в котором преобладает O(m*log(n))
предыдущего поиска.
2-й алгоритм O (m + n)
Второй алгоритм начинается с ячейки в (n,m)
. Для каждого столбца, начиная с последнего, мы go поднимаемся, пока находимся в ячейке с 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)