Все темы
139

Обход матрицы слоями: поворот и спираль

Tier 1Закрыто

Где применяется

1. Задача

Матрица это таблица значений из строк и столбцов. Иногда нужно прочитать все клетки в определённом порядке или переставить каждую клетку на новое место. Для этого есть два классических приёма: прочитать таблицу по спирали по часовой стрелке и повернуть всю таблицу на четверть оборота по часовой стрелке.

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

Поворот: поверни таблицу на 90 градусов по часовой стрелке, чтобы верхняя строка оказалась правым столбцом.

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

Этот шаг из платной части

Бесплатные шаги в начале курса (их 33) открыты всем: урок, задача и тесты. Этот шаг открывается с полным доступом. Начни с бесплатного аккаунта и бесплатных шагов.

Завести бесплатный аккаунтПосмотреть, что входит
Обход матрицы по спирали
spiralOrder([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]])
matrix
0123
01234
15678
29101112
313141516
top = 0bottom = 3left = 0right = 3
result
пусто

Читаем матрицу по спирали. Четыре границы отмечают кольцо, которое ещё предстоит обойти: top, bottom, left и right.

Как узнать

Обход матрицы (спираль / диагонали) (Matrix traversal (spiral / diagonal))

Эти слова в условии значат этот паттерн

  • прочитать или заполнить сетку по спирали
  • обойти матрицу по диагоналям
  • повернуть матрицу на 90 градусов
  • посетить каждую ячейку в фиксированном геометрическом порядке

Похоже, но не то

Сетка r на c даёт O(rc), потому что каждая клетка посещается один раз. Память O(1) сверх ответа.

На LeetCode

Задачи на матрицу, где сетку читают или заполняют кольцо за кольцом или поворачивают на четверть оборота. Четыре маркера края обходят внешнее кольцо и сдвигаются внутрь, а поворот переводит клетку (i, j) в (j, R минус 1 минус i).

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