Все темы
43

Сколько пересекается в самый загруженный момент

Tier 1Закрыто

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

1. Задача

У офиса есть общие переговорные комнаты. Встречи на день: [[0,30],[5,10],[15,20]], время в минутах. Сколько комнат нужно, чтобы каждой встрече хватило места?

Слияние из прошлого урока здесь не поможет. Возьми встречи [0,30] и [5,10]. Слияние превратит их в один блок [0,30]. Но с 5-й по 10-ю минуту идут обе встречи, и комнат для них нужно две. После слияния этого количества уже не видно.

Поэтому вопрос ставится так: сколько встреч идёт одновременно в самый загруженный момент дня. Это число, пик, и есть количество нужных комнат. Тот же вопрос встречается в другом виде: «сколько соединений с базой данных было открыто одновременно» или «сколько пользователей было онлайн в одну и ту же секунду».

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

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

Завести бесплатный аккаунтПосмотреть, что входит
Наибольшее число одновременно открытых интервалов
maxOverlap([[1, 4], [2, 5], [7, 9], [3, 6], [5, 8]])
шкала (по строке на интервал)
123456789
[1,4]■■■■
[2,5]■■■■
[7,9]■■■
[3,6]■■■■
[5,8]■■■■
events
пусто
active = 0best = 0

Сколько интервалов открыто в самый загруженный момент? Каждый интервал это строка на шкале.

Как узнать

Линия развёртки (подсчёт событий) (Sweep line (event counting))

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

  • максимум одновременно пересекающихся встреч/интервалов
  • минимум комнат/ресурсов
  • самый загруженный момент времени
  • сколько интервалов покрывают заданную точку
  • события, происходящие в одно и то же время

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

  • Интервалы: слияние и вставка (Intervals: merge & insert)

    Слияние держит интервалы целыми и соединяет соприкасающиеся. Развёртка про них забывает и считает.

  • Массив разностей (Difference array)

    Это развёртка, в которой координаты и есть индексы массива. Ей нужен узкий плотный диапазон.

  • Бинарная куча / очередь с приоритетом (Binary heap / priority queue)

    Куча держит открытые интервалы и знает, какой кончится раньше. Счётчик знает только сколько их.

  • Префиксные суммы (Prefix sums)

    Префиксные суммы отвечают по фиксированным позициям массива. Развёртка идёт по событиям в порядке сортировки.

n интервалов дают 2n событий, значит O(n log n) на сортировку. Сам проход стоит O(n).

На LeetCode

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

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