О курсе
Что изучаем в курсе
Алгоритмы — это способы пошагово решать задачи и работать с данными. Они помогают не только написать корректную программу, но и сделать её достаточно быстрой по времени и экономной по памяти.
Курс построен от базовых принципов к более сложным техникам: оценке сложности, массивам и строкам, поиску и сортировкам, стекам и очередям, связным спискам, деревьям, графам, рекурсии, жадным алгоритмам и динамическому программированию.
Для закрепления практических навыков используются разные виды заданий:
- Тест с выбором варианта ответа;
- Дописать фрагмент алгоритма;
- Расставить шаги решения в правильном порядке;
- Соединить термины с определением;
- Вписать точный ответ;
- Выделить ошибочную строку;
- Самостоятельно реализовать решение задачи.
Разные форматы практики помогают не только помнить названия алгоритмов, но и понимать их поведение: какие данные хранятся в структуре, как меняется состояние на каждом шаге и откуда берётся итоговая сложность.
Маршрут курса
Темы расположены так, чтобы новые подходы опирались на уже знакомые идеи:
- Базовые принципы. Что такое алгоритм, как оценивать сложность, как работать с массивами, строками, поиском и сортировкой.
- Структуры данных. Стэки, очереди, связные списки, деревья, хеш-структуры и графы.
- Алгоритмические техники. Рекурсия, два указателя, скользящее окно, жадные решения, обходы, динамическое программирование и другие паттерны.
Если решение сложной задачи перестаёт быть понятным, полезно вернуться к небольшому примеру и буквально пройти алгоритм вручную: какие значения меняются, что лежит в структуре данных и почему следующий шаг допустим.
Как мы разбираем алгоритмы
Примеры остаются небольшими: одна задача — одна основная идея. Так проще увидеть сам алгоритм и не потеряться в лишнем коде.
int left = 0;
int right = numbers.length - 1;
while (left < right) {
int sum = numbers[left] + numbers[right];
if (sum == target) {
return true;
}
if (sum < target) {
left++;
} else {
right--;
}
}
Здесь важно не просто запомнить движение двух указателей.
Нужно понимать условие, при котором этот подход работает:
массив отсортирован, поэтому сравнение суммы с target
подсказывает, какой из указателей можно безопасно сдвинуть.
Тот же принцип — искать свойство, которое позволяет отбросить часть вариантов —
будет встречаться и в других алгоритмах.