Эта задача похожа на «Поиск в 2D матрице», решение которой я написал в своей предыдущей статье. Если вы читали предыдущую статью, прочтите описание проблемы и переходите к эффективному решению.
Ссылка на проблему
Описание проблемы:
Напишите эффективный алгоритм, который ищет значение target
в целом числе m x n
matrix
. matrix
имеет следующие свойства:
- Целые числа в каждой строке сортируются по возрастанию слева направо.
- Целые числа в каждом столбце сортируются по возрастанию сверху вниз.
Наивное решение:
Обход каждого элемента в матрице и сравнение его с целевым значением. Временная сложность O(mn), что очень неэффективно.
Достойное решение:
Поскольку каждая строка отсортирована, мы можем использовать бинарный поиск для поиска каждой строки. Временная сложность этого решения составляет O(nlogm). logm — это время, необходимое для двоичного поиска в строке, и, поскольку мы делаем это для каждой строки, O (n * logm) — это общая временная сложность.
Эффективное решение:
Предложенное выше решение O(nlogm) является достойным решением, но мы можем дополнительно его оптимизировать. Нам не нужно проходить каждую строку. В вопросе говорится, что целые числа в каждом столбце также отсортированы.
Итак, из примеров, если вы внимательно посмотрите, элемент в правом верхнем углу имеет все элементы меньше, чем он, слева от него, и все элементы больше, чем он, в его нисходящем направлении.
- Начните с верхнего правого
- Если цель меньше, чем верхний правый элемент, двигайтесь влево, так как мы можем игнорировать этот столбец.
- Если цель больше, чем верхний правый элемент, двигаться вниз, так как мы можем игнорировать эту строку
В примере 1 15 — это элемент в правом верхнем углу.
- [1,4,7,11] находятся слева от 15, которые меньше его.
- [19,22,24,30] расположены в нисходящем направлении и больше 15.
- Целевой элемент равен 5, что меньше 15. Итак, мы движемся влево.
- Теперь 5‹11, снова влево
- Теперь 5‹7, снова влево
- Теперь 5>4, двигаться вниз
- Доходим до целевого элемента 5.
Временная сложность — O(m+n).