Я думаю, вы не можете надеяться на более чем O(N)
, что достижимо. (N - ширина матрицы).
Почему вы не можете надеяться на большее
Представьте себе такую матрицу:
0 0 0 0 0 0 ... 0 0 x
0 0 0 0 0 0 ... 0 x 2
0 0 0 0 0 0 ... x 2 2
.....................
0 0 0 0 0 x ... 2 2 2
0 0 0 0 x 2 ... 2 2 2
0 0 0 x 2 2 ... 2 2 2
0 0 x 2 2 2 ... 2 2 2
0 x 2 2 2 2 ... 2 2 2
x 2 2 2 2 2 ... 2 2 2
где x
- неизвестное число (не то же самое число, т. Е. Оно может быть разным в каждом столбце). Чтобы удовлетворить монотонность матрицы, вы можете разместить любое из 0, 1 или 2 во всех x
местах. Итак, чтобы узнать, есть ли в матрице 1, вам нужно проверить все x
мест, а их N.
Как это сделать O(n)
Представьте, что вы должны найти указатели первого столбца с number > q
(заданным числом) для всех строк. Вы начинаете в верхнем правом углу матрицы; если число, которое вы видите, больше, вы идете налево; иначе идти вниз. Конец, когда вы находитесь в последнем ряду. Точки, куда вы спустились, - это места, которые вы ищете. Если у любого из них есть номер, который вы ищете, вы его нашли.
Этот алгоритм O(n)
, потому что на каждом шаге вы либо идете влево или вниз. В целом, он не может идти больше N
раз влево и N
раз вниз. Поэтому это O(n)
.