Программа изучения алгоритмов

Сначала не задачи, а понимание, чем ты вообще управляешь.

Нужно знать:

  • Big O: O(1), O(log n), O(n), O(n log n), O(n²)
  • массивы / списки
  • строки
  • hash map / hash set
  • stack / queue / deque
  • linked list
  • heap / priority queue
  • tree / binary tree / BST
  • graph
  • trie
  • disjoint set union

Связанные материалы из раздела алгоритмов:

  • Big O — оценка роста алгоритма и различие worst-case, average-case, expected и amortized.
  • Linear space — что значит дополнительная память O(n).
  • Array — индексированная последовательность элементов.
  • Stack — структура с доступом к последнему добавленному элементу.
  • Sorted array — как использовать отсортированный массив.
  • Frequency map — hash map как словарь частот.
  • Seen set — hash set для проверки, встречался ли элемент раньше.
  • Grouping — hash map для раскладывания элементов по группам.
  • Lookup O(1) — быстрый доступ по ключу в hash map и hash set.
  • Min Stack — стек с быстрым getMin() за O(1).
  • Monotonic stack — стек, который хранит кандидатов в возрастающем или убывающем порядке.
  • Valid Parentheses — базовая задача на стек и порядок закрытия скобок.
  • Two pointers — базовый паттерн работы с массивами и строками.
  • Sliding window — окно поверх массива, строки или потока.
  • Prefix sum — быстрые суммы на отрезках.
  • Difference array — быстрые массовые обновления диапазонов.
  • Sorting + scan — сортировка и один проход по данным.
  • Intervals — работа с диапазонами.
  • In-place modification — изменение массива без дополнительной структуры.

Цель: видеть не «задачу», а структуру:
что тут хранится, как быстро ищется, как обновляется.


2. Паттерны задач, а не отдельные задачи

Вот это ключевое. LeetCode надо учить не как «1000 задач», а как набор повторяющихся схем.

Блок 1. Arrays / Strings

  • two pointers
  • sliding window
  • prefix sum
  • difference array
  • sorting + scan
  • intervals
  • in-place modification

Примеры тем:

  • найти пару / тройку
  • убрать дубликаты
  • максимум/минимум окна
  • подмассив с условием
  • объединение интервалов

Блок 2. Hashing

  • frequency map
  • seen set
  • grouping
  • lookup за O(1)

Примеры:

  • anagram groups
  • two sum
  • longest consecutive sequence
  • first unique character

Блок 3. Stack / Queue

  • monotonic stack
  • valid parentheses
  • next greater element
  • min stack
  • BFS queue

Особенно важен monotonic stack — он часто выглядит магией, пока не увидишь паттерн.


Блок 4. Binary Search

Не только «найти число в массиве», а:

  • binary search on answer
  • lower bound / upper bound
  • search in rotated array
  • capacity / minimum possible maximum
  • first true / last false

Это один из самых важных блоков для собесов.


Блок 5. Recursion / Backtracking

  • subsets
  • permutations
  • combinations
  • DFS через выбор
  • pruning

Важно понять схему:

choose
explore
undo

Блок 6. Trees

  • DFS preorder / inorder / postorder
  • BFS level order
  • recursion over tree
  • path sum
  • lowest common ancestor
  • validate BST
  • serialize / deserialize tree

Деревья — это место, где recursion становится нормальной, а не страшной.


Блок 7. Graphs

  • BFS
  • DFS
  • visited set
  • connected components
  • cycle detection
  • topological sort
  • shortest path
  • Dijkstra
  • Union-Find

Графы — это не отдельная структура. Это модель отношений. Очень мощный блок.


Блок 8. Dynamic Programming

Вот тут нельзя начинать сразу с хардов.

Идти надо так:

  1. recursion
  2. recursion + memo
  3. bottom-up DP
  4. space optimization

Темы:

  • Fibonacci-like
  • climbing stairs
  • house robber
  • coin change
  • longest increasing subsequence
  • longest common subsequence
  • knapsack
  • grid DP
  • interval DP

Главная формула DP:

state
transition
base case
answer

3. Порядок прохождения

Я бы сделал так:

Этап 1 — 2 недели

База:

  • Big O
  • arrays
  • strings
  • hash map
  • stack
  • queue
  • sorting
  • two pointers
  • sliding window

Цель: выйти из состояния «я не понимаю, что вообще происходит».


Этап 2 — 3 недели

Средний фундамент:

  • binary search
  • linked list
  • trees
  • recursion
  • backtracking

Цель: начать видеть повторяющиеся формы задач.


Этап 3 — 3 недели

Сильная середина:

  • graphs
  • BFS / DFS
  • topological sort
  • heap
  • intervals
  • monotonic stack
  • union-find

Цель: закрыть основное тело interview-задач.


Этап 4 — 4 недели

DP:

  • memoization
  • 1D DP
  • 2D DP
  • knapsack
  • LIS
  • LCS
  • grid DP

Цель: перестать бояться DP и видеть его как таблицу смысловых состояний.


4. Как заниматься каждый день

Не «решать побольше», а так:

Один день:

  1. Берёшь один паттерн.
  2. Читаешь короткое объяснение.
  3. Разбираешь 2 простые задачи.
  4. Решaешь 2–3 сам.
  5. После решения выписываешь шаблон.

Например:

Sliding window:
- есть левый и правый указатель
- расширяем окно
- если условие нарушено — двигаем левый
- обновляем ответ

Вот это и есть настоящее обучение.


5. Минимальный набор задач

Не надо сразу 500.

Нужно примерно:

  • 30 easy
  • 80 medium
  • 20 hard

Но не подряд, а по темам.

То есть не:

случайная задача → случайная задача → случайная задача

А:

10 задач на sliding window
10 задач на binary search
10 задач на trees
10 задач на graphs
...

6. Главная программа

Я бы назвал её так:

Algorithmic Core

Модуль 1. Complexity and Data Structures

Модуль 2. Arrays and Strings

Модуль 3. Hashing

Модуль 4. Two Pointers and Sliding Window

Модуль 5. Stack, Queue, Monotonic Structures

Модуль 6. Binary Search

Модуль 7. Recursion and Backtracking

Модуль 8. Linked Lists

Модуль 9. Trees

Модуль 10. Graphs

Модуль 11. Heap and Priority Queue

Модуль 12. Intervals

Модуль 13. Union-Find

Модуль 14. Dynamic Programming

Модуль 15. Mixed Interview Practice


Самое важное: тебе нужно не «натаскиваться», а восстановить алгоритмическую карту. Тогда каждая задача перестанет быть случайной стеной и станет вариантом уже известной формы.

Прокрутить вверх