Сигнал в условии и шаблон
Сигнал в условии и шаблон

Мышление шаблонами

Большинство алгоритмических задач — вариации небольшого числа шаблонов. Половина успеха — узнать сигнал в условии: «отсортированный массив», «подряд идущая подпоследовательность», «кратчайший путь», «все комбинации», «лучший результат, подзадачи повторяются». Затем вы пишете код соответствующего шаблона. Этот урок — карта; у каждого шаблона в курсе есть подробная тема.

От сигнала к шаблону

Сигнал в условииШаблонТипичная сложность
отсортированный массив, найти пару/тройкудва указателяO(n)
подряд идущий подмассив/подстрока, длина kскользящее окноO(n)
«есть ли», подсчёт, повторы, поиск парыhash map / setO(n)
отсортировано или монотонно, «первый подходящий»бинарный поискO(log n)
кратчайший путь в графе/сетке (без весов)BFSO(V + E)
компоненты, цикл, все путиDFSO(V + E)
«k наибольших», медиана потокакучаO(n log k)
интервалы, слияние, пересечениясортировка + проходO(n log n)
все подмножества/перестановкиbacktrackingэкспоненциальная
оптимум, подзадачи повторяютсядинамическое программированиеразмер таблицы

Два указателя и скользящее окно

В отсортированном массиве идём с двух концов к центру: сумма велика — двигаем правый, мала — левый. Каждый элемент проходится не более одного раза: O(n). В окне добавляем новый элемент и убираем старый: обновление за O(1) вместо повторного суммирования. Подробнее: два указателя, скользящее окно.