Репозиторий с материалами для изучения алгоритмов с нуля до уровня «прохожу собеседования». Маршрут рассчитан на 4-6 месяцев при ~1-2 часа в день, либо 2-3 месяца при ~3-4 часа в день.
В репозитории 5 файлов, каждый со своей ролью. Они не читаются подряд — это справочники и инструменты, которые применяются в разные моменты обучения.
| № | Файл | Назначение | Когда открывать |
|---|---|---|---|
| 1 | learn_algoritm.md | Теоретическая база: Big-O, структуры данных, рекурсия, метод решения задачи | В самом начале — прочитать целиком. Потом — перечитывать при сомнениях |
| 2 | dictionary.md | Словарь ключевых терминов (коллизия, инвариант, амортизированная сложность и т.д.) | Держать открытым всё время. Лезть, когда встречаешь незнакомое слово |
| 3 | vizualization.md | ASCII-визуализация работы 17 паттернов по шагам | Перед тем, как начинать паттерн — чтобы увидеть, как он работает |
| 4 | pattern_algoritm.md | Шаблоны кода на Go для всех 17 паттернов + классические задачи | Во время решения задач — как справочник по синтаксису и заготовкам |
| 5 | leetcode_list_check.md | Чек-лист из ~90 задач LeetCode по темам, отмечаешь решённые | Каждый день, когда решаешь задачи |
Один день из середины маршрута (например, неделя по Sliding Window):
- Утром открываешь
vizualization.md→ смотришь раздел Sliding Window, вспоминаешь визуально. - Открываешь
pattern_algoritm.md→ читаешь шаблон на Go, видишь классические задачи. - Открываешь
leetcode_list_check.md→ берёшь следующую нерешённую задачу из следующей темы (разные темы в разные дни) , с верху в низ, они расположенны по сложности и сгруппированы по темам. - Решаешь её. Если встречается незнакомый термин — смотришь в
dictionary.md. - Если запутался в теории (например, какая сложность допустима) — возвращаешься в
learn_algoritm.md. - Решил → ставишь
[X]в чек-листе.
Три принципа, на которых всё держится:
Паттерны важнее задач. Цель каждого этапа — освоить способ мышления, а не набрать счётчик решённых. Задач тысячи, паттернов — 17.
Глубина важнее скорости. Лучше 150 задач, каждая из которых проработана, чем 500 случайных.
Повторение обязательно. Задача считается пройденной, когда ты можешь решить её через неделю с нуля.
План по неделям
- Выбрать язык (в этом репо примеры на Go).
- Настроить окружение: локальный редактор, git-репозиторий для решений.
- Зарегистрироваться на LeetCode и NeetCode.io.
- Прочитать learn_algoritm.md целиком.
Цель — освоить язык анализа и базовые структуры.
Что изучить:
- Определение Big-O, Θ, Ω — на пальцах.
- Сложности базовых операций: массив, hash map, список, стек, очередь.
- Таблица «размер входа → допустимая сложность».
- Амортизированная сложность на примере динамического массива.
Проверочные упражнения (не на LeetCode, а в голове):
- Для 10 случайных фрагментов кода — определить сложность за 30 секунд.
- Для 5 задач — по размеру
nугадать класс алгоритма, который пройдёт.
Итог недели: смотришь на вложенный цикл и мгновенно говоришь O(n²); видишь n ≤ 10⁵ и понимаешь, что нужен минимум O(n log n).
Что изучить:
- Массив и срез: цена вставки/удаления, как реализован
append. - Hash map: как работает внутри, что такое коллизия, почему
O(1)в среднем. - Стек и очередь: реализация через срез, типовые операции.
- Односвязный список: структура узла, обход, базовые манипуляции.
Задачи (15-20 штук, все Easy):
- Arrays & Hashing: Contains Duplicate, Valid Anagram, Two Sum, Group Anagrams.
- Stack: Valid Parentheses, Min Stack.
- Linked List: Reverse Linked List, Merge Two Sorted Lists, Linked List Cycle.
Это сердце маршрута. Каждый паттерн — одна неделя. Порядок важен: следующие опираются на предыдущие.
Правила этапа:
- Понедельник: теория + один шаблон.
- Вторник-четверг: 2-3 задачи в день, Easy → Medium. На каждую — 30-40 минут честной попытки, потом разбор.
- Пятница: 1-2 Hard-задачи.
- Суббота: перерешиваешь 3-4 задачи недели с нуля на скорость.
- Воскресенье: пишешь свой конспект.
Метрика усвоения: в конце недели можешь за 5 минут объяснить паттерн вслух и написать шаблон на чистом листе без подглядывания.
| Неделя | Паттерн | Ключевые задачи |
|---|---|---|
| 3 | Two Pointers | Valid Palindrome, 3Sum, Container With Most Water, Trapping Rain Water |
| 4 | Sliding Window | Best Time to Buy and Sell Stock, Longest Substring Without Repeating, Minimum Window Substring |
| 5 | Binary Search | Binary Search, Koko Eating Bananas, Search in Rotated Sorted Array, Find Minimum in Rotated |
| 6 | Stack (углублённо) | Min Stack, Evaluate RPN, Daily Temperatures, Largest Rectangle in Histogram |
| 7 | Linked List (углублённо) | Reorder List, Remove Nth Node, LRU Cache, Merge K Sorted Lists |
| 8 | Повторение | Не новые темы — перерешать всё сложное с прошлых 5 недель |
Итог этапа: ты умеешь распознавать и применять 5 базовых паттернов. Это уже покрывает ~40% задач на собеседованиях.
| Неделя | Тема | Что делаем |
|---|---|---|
| 9 | Рекурсия как инструмент | Теория: дерево вызовов, принцип доверия, post-order возврат информации. 5-7 рекурсивных функций на бумажке |
| 10 | Бинарные деревья | Invert, Max Depth, Same Tree, LCA, Level Order, Serialize/Deserialize |
| 11 | Trie + Backtracking | Implement Trie, Word Search II, Subsets, Combination Sum, Permutations, N-Queens |
Итог этапа: рекурсия больше не пугает. Ты можешь написать backtracking с нуля, глядя только на условие задачи.
| Неделя | Тема | Что делаем |
|---|---|---|
| 12 | Heap / Priority Queue | Kth Largest, K Closest Points, Task Scheduler, Find Median from Data Stream |
| 13 | Графы (базовые) | Number of Islands, Clone Graph, Pacific Atlantic, Rotting Oranges, Course Schedule |
| 14 | Advanced Graphs | Network Delay Time (Дейкстра), Cheapest Flights (Bellman-Ford), Min Cost to Connect Points (MST) |
Итог этапа: ты умеешь строить граф по условию задачи (часто это самая сложная часть) и применять нужный алгоритм.
| Неделя | Тема | Что делаем |
|---|---|---|
| 15 | 1-D DP | Climbing Stairs, House Robber, Coin Change, Word Break, LIS |
| 16 | 2-D DP | Unique Paths, LCS, Edit Distance, Interleaving String, Regular Expression Matching |
| 17 | Повторение DP | Не новых задач — перерешиваешь 15-20 DP-задач предыдущих двух недель с нуля |
Схема работы над DP-задачей:
- Определи состояние: что значит
dp[i]в терминах задачи. - Найди переход: как
dp[i]выражается через предыдущие. - Задай базу:
dp[0],dp[1]. - Определи порядок обхода.
- Оптимизация памяти, если зависит только от нескольких предыдущих.
Итог этапа: DP больше не кажется магией. Ты видишь состояние и переход в большинстве задач сам.
| Неделя | Тема | Ключевые задачи |
|---|---|---|
| 18 | Intervals + Greedy | Merge Intervals, Meeting Rooms II, Jump Game, Gas Station, Partition Labels |
| 19 | Bit Manipulation + Math | Single Number, Counting Bits, Pow(x, n), Happy Number, Spiral Matrix |
| 20 | Резерв + слабые места | Выделяешь 3-4 паттерна, которые даются хуже всего — решаешь по ним 15-20 задач |
Итог этапа: ты закрыл все 17 паттернов и видишь свои слабые места.
Здесь сдвигается цель: уже не «научиться», а «применять под давлением».
Что делать каждый день:
- 2-3 задачи в режиме mock interview: таймер 35 мин (medium) или 45 мин (hard).
- Проговариваешь вслух: «Читаю условие… вижу отсортированный массив, думаю про two pointers…»
- Только потом пишешь код.
- После решения — полный разбор: оптимизации, edge cases, альтернативы.
Минимум 1 раз в неделю — полный mock interview:
- С другом, на Pramp, interviewing.io или с AI-интервьюером.
- 45 минут, 1 задача + behavioral вопросы.
Списки для проработки:
- NeetCode 150 — если ещё не решил всё. Минимум.
- Blind 75 — подмножество NeetCode 150, которое чаще всего спрашивают.
- Список задач конкретной компании на LeetCode (нужен Premium), если готовишься к конкретному собесу.
Эти активности идут фоном с самого начала и до конца.
Ежедневная задача «на поддержку» (10-15 минут). Одна Easy-задача из уже пройденной темы — чтобы руки не забывали. Особенно важно в отпуске или когда основной план буксует.
Ведение конспекта паттернов. Не разборы задач, а именно паттерны. Один файл на паттерн. Содержимое:
- По каким словам в условии узнаю;
- Шаблон кода;
- 3-5 самых показательных задач;
- Типовые ошибки;
- «Родственные» паттерны.
Повторение по интервалам. Задача, которая далась тяжело:
- Перерешать через 1 день.
- Потом через 3 дня.
- Потом через неделю.
- Потом через 2-3 недели.
Если каждый раз решается легко — закрываешь для повторений. Если забылась — возвращаешь в цикл.
«Решаю по 10 задач в день и через месяц буду готов». Не будешь. Задачи без осмысления → пустые счётчики. Лучше 2-3 задачи с глубоким разбором.
«Эта задача сложная, посмотрю разбор сразу». Убивает прогресс. 30-40 минут честной попытки — минимум. Даже если не решил, мозг провёл работу, без которой разбор не усвоится.
«Решил — двигаюсь дальше». Задача решена, когда ты можешь повторить это через неделю. Без повторений через 2 месяца ты забудешь 80%.
«Перепрыгиваю темы, которые скучные». Пропуск фундамента возвращается на более сложных этапах. Двигаешься линейно.
«Читаю теорию, но не пишу код». Самая опасная ловушка. Алгоритмы — двигательный навык, как игра на инструменте. Только через пальцы.
«Смотрю решения и киваю — понятно же». Понимание чужого решения ≠ умение написать своё. Всегда — закрыть разбор и написать с нуля.
«Только на LeetCode, без контестов». Контесты (LeetCode Weekly Contest, Codeforces) дают навык решать под временным давлением — без них собес будет тяжелее.
Цель — пройти собес в FAANG. Фокус на mock interviews, список задач конкретной компании, system design (middle+), behavioral.
Цель — спортивное программирование. Переходишь на Codeforces, участвуешь в раундах, добавляешь: сегментные деревья, Fenwick tree, строковые алгоритмы (KMP, Z-функция, суффиксные структуры), продвинутую комбинаторику, теорию чисел.
Цель — применять в работе. Возвращаешься к своим рабочим задачам и замечаешь, где теперь применим один из 17 паттернов. Это может быть кэширование, обработка событий, парсинг, оптимизация БД-запросов.
- NeetCode Roadmap — визуальный roadmap с видеоразборами
- LeetCode — основная площадка для практики
- Blind 75 — минимальный набор задач для собесов
- Big-O Cheat Sheet — таблица сложностей всех структур и алгоритмов
- VisuAlgo — интерактивные визуализации алгоритмов
