Алгоритмика: Методы решения задач
Методы алгоритмики
Glossary overview

Алгоритмика: Методы решения задач

ПодходКоротко что этоГде часто встречаетсяТипичная сложность
2 указателя (two pointers)два индекса двигаются по массиву/строке и “сходятся” или идут параллельнослияние отсортированных, two sum в отсортированном, палиндромы, partitionчасто O(n)
Словарь (map/set, хеш-таблица)кладем в ассоц массив для быстрых проверок/счетчиковtwo sum, дубликаты, частоты, пересечения, группировкичасто O(n)
Жадный алгоритм (greedy)на каждом шаге берешь локально лучший вариантсдача монет, интервалы, расписания, “макс выгода”обычно O(n log n) из-за сортировки
Динамическое программирование (DP)решаем через подзадачи + запоминаем результатырюкзак, пути, подстроки, “максимум/минимум при условиях”часто O(n*m) или O(n)
Рекурсия + мемоизациярекурсия, но чтобы не считать одно и то же, кешируемfib, пути, комбинации, game DPзависит от задачи
Разделяй и властвуйразбили на части, решили, склеилиmerge sort, quick sort, бинарный поискчасто O(n log n)
Бинарный поискищем по отсортированному или по “монотонному условию”поиск в массиве, “минимальное подходящее значение”O(log n) или O(n log X)
Скользящее окно (sliding window)окно [l..r] двигается, поддерживаем условиеподмассивы/подстроки, суммы, “самый длинный”часто O(n)
Стек/монотонный стекхраним кандидатов, выкидываем лишнееближайший больший/меньший, скобки, daily temperaturesO(n)
Очередь/монотонная очередькак стек, но для окон: максимум/минимум в окнеmax/min в sliding windowO(n)
Сортировка как прием“отсортируй и станет легко”уникальные, интервалы, two pointers после сортировкиO(n log n)
BFS (поиск в ширину)слоями от стартакратчайший путь в невзвешенном графе, лабиринтO(V+E)
DFS (в глубину)идем вглубь, потом назадкомпоненты связности, топология, обходыO(V+E)
Backtrackingперебор с откатом, часто с отсечениямикомбинации, перестановки, n-queens, sudokuчасто экспонента
Префиксные суммызаранее считаем суммы до iсуммы на отрезке, подмассив с суммой, частые запросыподготовка O(n), запрос O(1)
Разностный массивобновления диапазонов без полного проходамассовые прибавки на диапазонеобновление O(1), финал O(n)
Union-Find (DSU)объединять множества и проверять связность“острова”, компоненты, MST (Краскал)почти O(1) амортизированно
Куча (heap, priority queue)быстро доставать min/maxтоп-K, планировщики, Dijkstraоперации O(log n)

Как “правильно приступать” к задаче

Есть набор “сигналов”, по которым почти всегда угадывается подход:

  1. Отсортировано, или можно отсортировать без потери смысла
    Часто это:
  • two pointers
  • бинарный поиск
  • merge / “слить два массива”
  • задачи на интервалы (greedy + sort)
  1. “Нужно найти пару/сумму/повтор/частоты/пересечение”
    Почти всегда:
  • словарь (map/set)
  1. “Самая длинная подстрока/подмассив с условием”, “окно”, “подряд”
    Почти всегда:
  • sliding window
  • иногда + словарь (для подсчета в окне)
  1. “Много запросов суммы на отрезке”, “сумма/кол-во от L до R”
    Почти всегда:
  • префиксные суммы
  • иногда разностный массив (если много обновлений диапазонов)
  1. “Ближайший больший/меньший справа/слева”, “скобки”, “температуры”, “гистограмма”
    Почти всегда:
  • стек или монотонный стек
  1. “Найти кратчайший путь в лабиринте/по клеткам без весов”
    Почти всегда:
  • BFS
  1. “Все варианты”, “перебрать комбинации”, “расставить”, “выбрать подмножество”
    Почти всегда:
  • backtracking (и дальше думать про отсечения)
  1. “Оптимум: максимум/минимум при ограничениях”, “выбрать лучшее, но есть зависимость от прошлого”
    Очень часто:
  • DP (динамика)
    Сигнал: “решение для i зависит от i-1 / i-2 / чего-то меньшего”.
  1. “Есть условие монотонности по ответу: если X подходит, то все больше тоже подходят”
  • binary search on answer
    Типовой пример: минимальная скорость/время/размер, чтобы уложиться.

С книги “Грокаем алгоритмы”.

Методы решения задач рассматриваются в главах 4, 8 и 9. Если вы столкнулись со сложной задачей и не знаете , как эффективно ее решить, воспользуйтесь стратегией «разделяй и властвуй» (глава 4) или методом динамического программирования (глава 9). А если вы поняли , что эффективного решения не существует, попробуйте получить приближенный ответ с использованием жадного алгоритма (глава 8).