Выбор активностей
Максимум непересекающихся интервалов: жадно по времени окончания.
1function maxActivities(intervals: Array<[s: number, e: number]>): number {2 const sorted = [...intervals].sort((a, b) => a[1] - b[1])3 4 let count = 05 let lastEnd = -Infinity6 for (const [start, end] of sorted) {7 if (start >= lastEnd) {8 count++9 lastEnd = end // жадный выбор: раньше кончается — берём10 }11 }12 13 return count14}Проблема
Максимум непересекающихся интервалов: жадно по времени окончания.
Что вы видите
Сортируем по правому краю; каждая встреча, начинающаяся после прошлой — берём.
Как это работает
Обменный аргумент доказывает оптимальность: любой другой выбор можно перестроить в жадный без потерь. Канонический пример, где жадность строго лучше перебора.
Пошаговый разбор
- 01
Сортировка
По времени окончания.
- 02
Совместимость
Начало ≥ конец прошлой.
- 03
Обменный аргумент
Жадный = максимум.
Complexity и ограничения
Сложность см. в шапке страницы.
Edge cases
- Пустой вход
Корректная тривиальная обработка.
- Вырожденный случай
Минимум работы — сразу ответ.
Где встречается в реальности
Календарь
Расписание переговорок.
ЦП
Time-slotting задач.
Алокатор
Свободные диапазоны памяти.
Связанные алгоритмы
«Максимум встреч в одном зале»
Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.
Shorts 9:16
Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.