Бесплатная бета: 60 дней полного доступа, без карты.мест осталось: 84Зарегистрироваться бесплатно

Мы используем необходимые куки для работы сайта (вход и язык). Если ты согласишься, мы также загрузим Google Analytics, чтобы видеть, какие страницы читают, и Google reCAPTCHA для защиты форм обратной связи и сообщений об ошибке от спама. Политика конфиденциальности

Все паттерны

Поиск в матрице (отсортированная сетка)

Matrix search (sorted grid)

O(m+n)

В сетке, отсортированной в обе стороны, из угла есть только одно направление. Сравнение отбрасывает целый ряд или столбец.

Обновлено 17 окт. 2026 г.

Поиск в матрице (отсортированная сетка): как это работает?

Отсортированные сетки бывают двух видов. В одной каждый ряд продолжает предыдущий, в другой ряды и столбцы просто возрастают.

Первый вид это отсортированный список, свёрнутый в ряды. Бинарный поиск идёт по r умножить на c позициям.

Для второго вида начните с правого верхнего угла. Слева от него всё меньше, а снизу всё больше.

Если значение там слишком велико, идите влево. Это сразу отбрасывает целый столбец.

Если оно слишком мало, идите вниз. Это отбрасывает целый ряд.

Каждый шаг убирает один ряд или один столбец. Поэтому обход кончается за r плюс c шагов.

Источники: Википедия: Двоичный поиск

  1. старт на 7, правый верхИщем 5 в сетке, возрастающей в обе стороны.
  2. 7 слишком великаВсё ниже семёрки в этом столбце больше. Идём влево.
  3. 4 слишком малаВсё левее четвёрки в этом ряду меньше. Идём вниз.
  4. теперь на 5Значение под обходом совпало с искомым.
  5. три шагаДевять клеток, три сравнения. Две линии отброшены целиком.
Поиск 14 в сетке, отсортированной по рядам и столбцам
searchMatrix([[1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30]], 14)
matrix: каждый ряд и каждый столбец возрастают
01234
01471115
12581219
23691622
31013141724
41821232630
row = 0col = 4target = 14steps = 0

Есть ли 14 в матрице? Начинаем с правого верхнего угла: слева от него всё меньше, снизу всё больше.

Гонка скорости
Поиск одного значения в одной и той же отсортированной таблице 6 на 8

Столбики: 48 ячеек таблицы, ряд за рядом; каждый ряд и каждый столбец возрастают. Искомое число в нижнем ряду. В таблице ниже n означает число ячеек квадратной таблицы.

Одна операция: одна проверенная ячейка. За каждый кадр все дорожки делают одинаковое число операций, поэтому медленная отстаёт.

Перебор всех ячеек O(m·n)
операций: 0
Поиск лесенкой O(m + n)
операций: 0

 

А если чисел больше

Операции для n чисел и примерное время при 100 миллионах простых операций в секунду. Это оценка по тому же счёту, а не замер.

n = 1 000
Перебор всех ячеек1 тыс. · меньше 1 мс
Поиск лесенкой63,2 · меньше 1 мс
n = 100 000
Перебор всех ячеек100 тыс. · 1 мс
Поиск лесенкой632,5 · меньше 1 мс
n = 10 000 000
Перебор всех ячеек10 млн · 100 мс
Поиск лесенкой6,3 тыс. · меньше 1 мс

Поиск в матрице (отсортированная сетка): шаблон кода

function searchMatrix(matrix, target) {
    let row = 0;
    let col = matrix[0].length - 1;
    while (row < matrix.length && col >= 0) {
        const v = matrix[row][col];
        if (v === target) return true;
        if (v > target) col--;
        else row++;
    }
    return false;
}

Поиск в матрице (отсортированная сетка): разбор примера

K-е наименьшее значение в отсортированной сетке

В сетке возрастают и ряды, и столбцы. Верните её k-е наименьшее значение.

Развернуть и отсортировать можно, но это читает каждую клетку.

Ведите бинарный поиск по диапазону значений, а не по позициям.

Для кандидата посчитайте, сколько клеток не больше него. Это число и говорит, какую половину оставить.

function kthSmallest(matrix, k) {
    const n = matrix.length;
    let lo = matrix[0][0];
    let hi = matrix[n - 1][n - 1];

    const countNotAbove = (value) => {
        let count = 0;
        let row = n - 1;

        // one staircase walk, starting from the bottom-left corner
        for (let col = 0; col < n; col++) {
            while (row >= 0 && matrix[row][col] > value) row--;
            count += row + 1;
        }

        return count;
    };

    while (lo < hi) {
        const mid = lo + Math.floor((hi - lo) / 2);
        if (countNotAbove(mid) >= k) hi = mid;
        else lo = mid + 1;
    }

    return lo;
}

Поиск в матрице (отсортированная сетка): когда применять?

Паттерн «Поиск в матрице (отсортированная сетка)» нужен, когда в условии есть слова «матрица отсортирована и по строкам, и по столбцам», «поиск значения в 2D отсортированной сетке» или «начать с угла и отбрасывать строку или столбец». Решение на нём обычно укладывается в O(m+n).

  • матрица отсортирована и по строкам, и по столбцам
  • поиск значения в 2D отсортированной сетке
  • начать с угла и отбрасывать строку или столбец
  • и строки, и столбцы монотонны

Слова в условии для всех паттернов собраны в одной таблице: шпаргалка по паттернам алгоритмов.

Поиск в матрице (отсортированная сетка): с чем путают?

Паттерн «Поиск в матрице (отсортированная сетка)» чаще всего путают с этими паттернами: Бинарный поиск (массив), Два указателя (с концов), Обход матрицы (спираль / диагонали) и Линейный поиск.

  • Бинарный поиск (массив) (Binary search (array)): Если каждый ряд продолжает предыдущий, сетка это один отсортированный список. Тогда работает обычный бинарный поиск.
  • Два указателя (с концов) (Two pointers (opposite ends)): Ход лесенкой это та же идея в двух измерениях. За шаг двигается ровно один индекс.
  • Обход матрицы (спираль / диагонали) (Matrix traversal (spiral / diagonal)): Там посещается каждая клетка в выбранном порядке. Здесь большинство клеток не читается вовсе.
  • Линейный поиск (Linear search): Перебор работает и стоит O(rc). Расточительным его делает как раз наличие порядка.

Поиск в матрице (отсортированная сетка): частые ошибки

  • Стартуют не из того угла

    Левая верхняя клетка меньше обоих соседей и направления не даёт. Начинайте справа сверху или слева снизу.

  • Считают построчную сетку полностью отсортированной

    Поиску по позициям нужно, чтобы каждый ряд продолжал предыдущий. Проверьте это до развёртки.

  • Сортируют всю сетку

    Так выбрасывается структура, которую вам дали. Плюс это стоит rc log rc.

  • Возвращают среднего кандидата

    При поиске по значению ответ обязан существовать в сетке. Сжимайте, пока границы не сойдутся.

Паттерн «Поиск в матрице (отсортированная сетка)» решает такие задачи с собеседований: Поиск в двумерной матрице, Поиск в двумерной матрице II, K-е наименьшее в отсортированной матрице, Поиск пика в матрице, Число отрицательных в отсортированной матрице, Медиана построчно отсортированной матрицы и Наименьший общий элемент всех рядов.

  • Поиск в двумерной матрице: Один отсортированный список, свёрнутый в ряды.
  • Поиск в двумерной матрице II: Ход лесенкой из угла.
  • K-е наименьшее в отсортированной матрице: Бинарный поиск по значениям с подсчётом на кандидата.
  • Поиск пика в матрице: Бинарный поиск по столбцам.
  • Число отрицательных в отсортированной матрице: Та же лесенка, но со счётом вместо совпадения.
  • Медиана построчно отсортированной матрицы: Считайте, сколько клеток не больше кандидата.
  • Наименьший общий элемент всех рядов: По указателю на ряд, двигаются вместе.

Поиск в матрице (отсортированная сетка): сложность по времени и памяти

У паттерна «Поиск в матрице (отсортированная сетка)» целевая сложность O(m+n).

Сетка r на c даёт O(r + c) при ходе лесенкой. Полностью отсортированная сетка позволяет O(log rc).

Где этот паттерн стоит в 150 шагах