Полевой справочник
Линия развёртки (подсчёт событий)
O(n log n)Преврати каждый интервал в событие начала (+1) и событие конца (-1), отсортируй все события по позиции, затем пройди по ним, прибавляя дельты к счётчику, чтобы найти самый загруженный момент.
Сигналы
максимум одновременно пересекающихся встреч/интерваловминимум комнат/ресурсовсамый загруженный момент временисколько интервалов покрывают заданную точкусобытия, происходящие в одно и то же время
Шаблон
function maxOverlap(intervals) {
const events = [];
for (const [start, end] of intervals) {
events.push([start, 1]);
events.push([end, -1]);
}
events.sort((a, b) => a[0] - b[0] || a[1] - b[1]);
let active = 0;
let best = 0;
for (const [, delta] of events) {
active += delta;
best = Math.max(best, active);
}
return best;
}Похоже, но не то
- Интервалы: слияние и вставка: Слияние выдаёт объединённые непересекающиеся диапазоны как итоговый ответ. Линия развёртки не объединяет диапазоны, она считает, сколько активно одновременно, а это нужно для «минимум комнат для встреч», а не для объединённого расписания.
n до 1e5 интервалов -> O(n log n): 2n событий сортируются по позиции, затем один линейный проход.
Изучить этот паттерн