Ваше решение действительно занимает O(n log n)
при условии, что вы просматриваете каждую строку, которую анализируете. Если вы не будете искать каждую строку, вы не сможете точно выполнить двоичный шаг.
O(n)
решение:
Выберите строку n/2
, вместо поиска по всей строке, мы просто берем первый элемент предыдущей строки и первый элемент следующей строки. O(1)
.
Мы знаем, что все элементы строки n/2
должны находиться между этими выбранными значениями (это ключевое наблюдение). Если наше целевое значение находится в интервале, ищите все три строки (3*O(n) = O(n)
).
Если наше значение находится за пределами этого диапазона, продолжайте в режиме двоичного поиска, выбрав n/4
, если наше значение меньше диапазона, и 3n/4
, если значение было больше, и снова сравните с одним элементом соседние ряды.
Поиск правильного блока из 3 строк будет стоить O(1) * O(log n)
, а поиск элемента будет стоить O(n)
.
Всего O(log n) + O(n) = O(n)
.