Привет, Хабр!
Сегодня я расскажу вам про мой путь от 0 до 500+ задач на Leetcode. Сначала, пару слов о себе: достаточно слабое образование, завалил кучу собеседований на алгоритмы (например, в Авито где-то в 2020 году), никогда не умел решать задачи, и не любил. Долгое время узнав о секции алгоритмов просто отказывался от собеседований. Сейчас не боюсь и могу. Даже в Бигтех эту секцию проходил несколько раз.
Я делал всякий фронтенд, потом стал делать бекенд (на NodeJS), но алгоритмы никогда не получались.
И вот, засучив рукава, я решил разделаться с этим безобразием раз и навсегда. Мой профиль на LeetCode на сегодняшний день выглядит так:

(при этом я не гонюсь за числом в профиле, но гонюсь за навыком)
Для кого статья: разработчики, которые пишут код, хотят прокачать навык решения алгоритмических задач, но пока не получается по разным причинам.
Кому статья не подойдет: "Мне живется хорошо, задачки ваши не нужны". Не нужны так не нужны :)
Здесь я не буду перечислять, какие задачи бывают, и как решать каждый тип. Лично мне такие статьи не помогали. Я буду описывать подходы, которые помогли мне самому, и до внедрения которых ничего не получалось.
Шаг 0. Мотивация
Одной из самых больших проблем для меня было найти мотивацию. Я понимал что решение задачек – моя слабая сторона, но не понимал, как это сделает из меня более крутого разработчика. При этом я замечал, что люди с более высокими хардскилами, чем у меня, все-таки, умеют их решать.
Понимание структур данных
Есть целый пласт задач на реализацию алгоритмов и структур данных, которые используются в других местах. Хороший пример – BST (Binary Search Tree). Реализовав его 1 (или пару) раз "руками" начинаешь глубже понимать, как это работает, и когда читаешь про системный дизайн и видишь: "индекс в СУБД реализован при помощи BST" то понимание происходящего приходит намного быстрее и легче. Сюда же бы отнес реализацию LRU (Least Recently Used) Cache, binary search, …
Меньше "магии" в инструментах
С одной стороны, не факт, что придется работать с картами как разработчику, с другой стороны вместо "карты это магия" начинаешь видеть в них графы, и алгоритм поиска кратчайшего пути. Да и самы графы вместо букв в тетради из университета или статьи из Википедии начинают обретать вполне себе обозримый смысл.
То же самое с играми. Поиск кратчайшего пути из точки А в точку Б для вашего персонажа становится куда более понятным с точки зрения реализации.
Спортивный интерес
Здесь, пожалуй, мое личное, но все же. Это похоже на некоторое состязание для разработчиков. В принципе, можно было выбрать любую интеллектуальную дисциплину. Задачки на алгоритмы объединяют в себе разработчиков приложений/бекенда/фронтенда, и это в какой-то степени наша общая боль ?
Гарант дисциплины / универсальное мери́ло
Я воспринимаю это так: "если уже этот человек смог со всех сил навалиться и преуспеть в одном деле – то сможет и в другом". Можно было бы взять что угодно – шашки/спорт/вышивание… Если человек обладает достаточной упертостью и умеет фокусироваться на цели и достигать ее – он это сможет сделать в рамках вашей компании. Это очень полезное качество. Но если шашки и вышивание были бы плохим мери́лом – то навык решения алгоритмов это вполне себе подходящее место.
Шаг 1. Режим
Стоит принять, что развитие этого навыка невозможно с наскока. Нельзя навалиться со всех сил и осилить его. Несколько раз я засучив рукава пытался со всех сил взять и прокачаться. Потом я уставал, что-то случалось, смена работы, отпуск, … В итоге я мог осилить ~15 задач за год:

Привычка – вторая натура
А что если не осилить этот навык за 2 недели? И даже за месяц. А что если попробовать выделять немного времени, но каждый день? Буквально одну помидорку. Можно даже оставить в отпуске и на праздники, но делать что-то совсем простое (~5-10 минут), чтобы все-таки восстанавливаться, но при этом не потерять привычку и не "вкатываться" в режим заново.
Как работает у меня: Каждое утро я посвящаю примерно 1 помидорку на обучение за утренним кофе. Иногда чуть больше, иногда чуть меньше. В какой-то момент я решил, что прям сейчас алгоритмов достаточно, и начал посвящать эту рутину другим темам (System Design / какая-то технология конкретная / etc).
Индивидуальное позитивное подкрепление
Тут нужно найти то, что драйвит лично вас. Меня драйвила серия дней без пропусков (эдакий Duolingo-style), сначала это целых 10 дней когда я решал задачи подряд, потом это 30! Целый месяц! Так я докатился до 365 дней решения задач на Leetcode подряд. Если есть друзья, которые вас хвалят – замечательно, делитесь с ��ими своими продвижениями, получайте похвалу. Главное, найдите то, что вам помогает.
Мой профиль выдерживая режим:

"Keep grinding". Почему это работает
"Keep grinding" ("просто продолжай делать"). Все знают, что "без труда не выловить и рыбку из пруда", и вообще надо трудиться, но все же. За счет чего именно упорство может привести к успеху?
Типы задач не бесконечны
Когда начинаешь решать задачи, сталкиваешься с новым классом задач, потом с еще одним, потом с еще одним… И вот проходят недели, а по ощущениям их как будто бы остается бесконечное множество впереди. В этот момент очень важно себе напоминать, что они начнут повторяться. "Keep grinding". И вот как наступит тот момент, когда задачи начнут повторяться – самое сложное позади. На определенном этапе либо с 90% задача будет поддаваться сама, либо с небольшой подсказкой (которые даже на собеседованиях будут).
Что если не решил
Главная цель – узнать и понять что-то новое сегодня. Если не решили задачу – можно осилить разбор решения, либо запустить debugger на рабочем коде и прям пошагово посмотреть, как выполняется алгоритм. Еще вариант – рисовать на листочке (я прям записывал значения на каждой итерации и визуализировал стрелочками). Самое важное – это понимание. Если сегодня понимания стало больше, чем вчера – вы на верном пути.
Сначала пробуй сам
Большой соблазн читать решение, и сразу смотреть разбор. "Вот я сейчас много задач разберу, и тогда смогу решать". Здесь очень похоже на изучение языков. Если вы хотите говорить на английском – слушать английский недостаточно, нужно говорить. Поэтому с задачами я рекомендую следующий подход: открываешь задачу, пытаешься решить сам. Если за 5-10 минут не получается вообще ничего – можно идти в решения и разбирать. Если получилось хоть какое-то – хорошо, теперь можно смотреть оптимальное. Если вообще получилось – ура, пожинаем плоды наших трудов.
Восприятие и насмотренность улучшается
Поначалу уровень когнитивной нагрузки при решении задач очень высок. И это нормально. Достаточно вспомнить момент первой встречи с циклами. Их буквально приходилось запускать в голове и проходить каждую итерацию. Возьмем кусок кода:
for (int i = 0; i < arrLength; i++) {
sum = sum + arr[i];
}
Сегодня такие блоки кода считываются практически мгновенно, и не расходуются силы на "запуск" каждой итерации цикла в голове (Мозг упрощает знакомый паттерн практически до sum = SUM(arr) и воспринимает почти как обычный текст).
В то время как при первом знакомстве вы разбирали этот код на отдельные команды и воспринимали его примерно так:
int i = 0;
i < arrLength; // Проверяем, где же там arrLength, и какой он
i = 0 + 1; // = 1
sum = sum + arr[0];
i = 1 + 1; // = 2
sum = sum + arr[1];
Что отличает блок кода выше от блока кода ниже? Да, объем кода больше, но если написать бинарный поиск несколько раз – он станет требовать куда меньше концентрации внимания:
int left = 0;
int right = nums.size() - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
return mid;
}
if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
Подобная "насмотренность" приходит по всем классам задач, и если вы напишете их по нескольку раз – больше не потребуется тратить на них много сил. И эта "насмотренность" приходит со временем. Ровно так же, как она пришла с for() {}.
Тратить деньги – тоже инструмент
Когда вы платите за изучение языка вы трудитесь более усердно, чем на бесплатных курсах. Когда вы покупаете абонемент в спортзал, вы посещаете его чаще, чем бесплатный турник на улице. Этот же принцип работает и с обучением алгоритмам. Я купил подписку, получил онлайн дебаггер (очень удобно), и доступ к разбору задач. За рекламу мне, к сожалению, не платят. Этот совет чисто от себя. Но ведь действительно ли вы готовы в это вкладываться, если не готовы потратиться? Вопрос хороший.
Покупка платной подписки/книги/курса говорит вам же о том, что вы вкладываетесь в это. И вам становится в том числе жалко расходовать ресурс в пустую. В данном случае ресурс – это не только деньги, но и драгоценное время.
Лично мой опыт – после покупки платных подписок и покупки книг я точно стал вкладываться больше и находить для обучения больше времени.
Быть лучше, чем вчера
Если быть откровенным – я не чувствую, что я прям круто решаю задачи. Я ждал, что снизойдет на меня вот это ощущение "ну все, теперь я освоил этот навык раз и навсегда!". Но из объективных вещей – я действительно стал проходить эти собеседования, и я стал ощущать себя намного увереннее по обе стороны технических собеседований. Если каждый день быть лучше чем вчера – однажды станешь достаточно хорош. Даже если ты этого пока не чувствуешь :-)
Комментарии (32)

ThisMan
25.12.2025 01:54А зачем?

aiminkai
25.12.2025 01:54Вы хоть статью прочитали? Автор всю её посвятил этому вопросу.
Встречный вам вопрос. А вы всё-всё в своей жизни делаете ради какой то возвышенной цели? Особенно интересно про свободное время. Здесь же автор вместо ежедневной вечерней деградации выбрал что-то с нагрузочкой. Ну браво, ну. Вероятно, и деменцию отодвинет на n лет. А я деградирую) И скипаю собесы с алгоритмами.

Newbilius
25.12.2025 01:54А вы всё-всё в своей жизни делаете ради какой то возвышенной цели?
Мимокрокодил: а почему цель обязательно должна быть "возвышенной"? "Мне это приносит удовольствие и хочется этим заниматься" - достаточный повод) У автора, имхо, это ключевое ("спортивный интерес"), проблем не вижу, быть счастливым делая что нравится - достойная цель сама по себе)

Lippiece
25.12.2025 01:54Автор посвятил вопросу мотивации (что может ответить на вопрос "зачем") только в части про мотивацию. Понимание структур данных, насмотренность (или знакомство) и спортивный интерес.
Реальная польза от этого, помимо бонусов во время формальных собесов, где это спрашивают, не раскрыта.Здесь она, кажется, раскрыта (хотя критика присутствует).

Alexandroppolus
25.12.2025 01:54Немного оффтоп, насчёт примера с бинарным поиском: лучше сделать "upper bound", а потом сравнить найденный элемент с искомым. В цикле не нужна проверка
nums[mid] == target. В среднем элемент всё равно будет найден на предпоследней итерации, то есть по факту у вас в цикле просто на одну проверку больше.

d_ilyich
25.12.2025 01:54У меня 2 "проблемы".
Я не могу решать быстро. По этой причине не участвую в литкодовских контестах.
Для большей части решённых задач я не смогу строго математически доказать правильность алгоритма. Для некоторых задач я просто строил таблицы "входные данные : результат" и находил закономерность.

aero2210
25.12.2025 01:54Автор "не гонится за цифрами", поэтому пишет про стрики (кол-во дней подряд)... сомневаюсь, что он набил 365 дней своими силами. Как не последний человек в leetcode-е, прямо скажу что автор копипастил решения, т.к. шанс того, что ему не попалась какая-нибудь харда с < 20% ar = 0. Тогда о какой "погоне за навыками" идёт речь?

d_ilyich
25.12.2025 01:54Ну, там же не обязательно решать день в день - у них Time Travel Ticket'ы есть. Я, правда, ни разу ими не пользовался -- не знаю, можно ли на месяц назад прыгнуть.

aero2210
25.12.2025 01:54суть даже не в этом, говорить что "я не гонюсь за цифрами" и набивать стрики звучит как-то противоречиво. Опять же, не факт что все задачи (в течении 365 дней) автор набил сам, поэтому в чем тогда смысл копипастить?

TimReset
25.12.2025 01:54В базах, насколько я знаю, не совсем BST, а B tree используется.

eugene_october Автор
25.12.2025 01:54Это верно. Для реляционных как правило используют B-tree. Из второй ссылки, к слову:
"The B-tree generalizes the binary search tree, allowing nodes to have more than two children"А буквально BST используются в виде красно-черных деревьев.

axion-1
25.12.2025 01:54Несколько раз я засучив рукава пытался со всех сил взять и прокачаться.
Если у вас сложности с мотивацией, возможно вам нет смысла решать задачи в таких количествах. Пару-тройку штук чтобы освоить какую-либо тему, нормально. Сотни - только если в охотку, иначе это бессмысленное достигаторство.
В своё время решил 200+ задач на Эйлере, вопросов как найти что меня драйвит даже не возникало. Было просто интересно.

Enedwait
25.12.2025 01:54Когда вы платите за изучение языка вы трудитесь более усердно, чем на бесплатных курсах. Когда вы покупаете абонемент в спортзал, вы посещаете его чаще, чем бесплатный турник на улице. Этот же принцип работает и с обучением алгоритмам.
Если это и работает, то только с определённым контингентом людей, которых именно трата денег мотивирует на что-то. Психолог бы сказал точно, в чём их/ваша боль.
Есть и другие люди, я в их числе, для которых ответы на эти три процитированных предложения: нет, нет и ещё раз нет.

Viacheslav01
25.12.2025 01:54От тут да, сколько денег слито за спортзалы, в которые никогда не ходил страшно представить )))

Schullz
25.12.2025 01:54Но ведь разборы для дейли задач обычно бесплатные и не требуют подписки. А встроенный дебаггер скорее минус - ведь на собеседование в бигтех его не всегда дают и заставляют в обычном блокноте писать

eugene_october Автор
25.12.2025 01:54Но ведь разборы для дейли задач обычно бесплатные и не требуют подписки
Выше тоже про дейли задачи где-то было в комментариях. Решать что-то каждый день != решать только дейли.
Есть замечательный блок "Editorial", там по темам здорово сгруппировано. Отдельно про графы, даже про сортировку неожиданно для меня было интересно (например, Counting Sort). Думаю, что у конкурентов есть похожие штуки. Не хотел бы на конкретной платформе акцентировать
ведь на собеседование в бигтех его не всегда дают и заставляют в обычном блокноте писать
У меня было 6 собеседований в бигтех за последние 2 года. На некоторых был дебаггер, но нужно было прям работающее решение, на некоторых действительно код не запускали. "В обычном блокноте писать" – мне кажется это какая-то старая байка, я ни разу с таким не встречался (хотя тоже слышал).

Viacheslav01
25.12.2025 01:54Блокнот, ну ок онлайн блокнот для кода, практикуют как минимум в яндексе и сбере.

vityo
25.12.2025 01:54Ты очень крут. Но я сам бросил где-то на 150-160 задач всего. Заметил что какие-то повторяться стали, плюс некоторые очевидно такие, что догадаться даже спустя часы не выйдет, либо знаешь, либо нет (ну да, да, как-то же к этому пришли, но и алгоритмы такие носят имена людей, и что-то не повторяются одни и те же имена часто, значит иногда дело глубоких знаний в узкой сфере и случая).
Так что я не знаю про какие ты 5-10 мин говоришь, я видел там топы и за 15 мин решали 4-5 задач турнирных. Но мне бы медиум уровень задачу за мин 40-60 и уже хорошо будет.
Я короче бросил, но может когда-то заведу новый лист и начну заново, пока что есть работа и другие занятия. Но ты реально крут все равно. У меня только бейджик 50 дней.
У брата препод коллега в универе , так он вообще процентиль где-то 99.99% похоже и почти все решил может 95% . Капец чел дотошный, но наверно долго он это делал, любитель такого.

eugene_october Автор
25.12.2025 01:54Так что я не знаю про какие ты 5-10 мин говоришь
Я говорил о 5-10 минут страданий перед пустым листком и 0 идей. Если даже не появляется мыслей как подступиться к задаче то нет смысла сидеть и страдать 25-30 минут без прогресса. Лучше открыть подсказки, открыть решение, разобрать. В этом был посыл. Я очень много лишнего времени потерял на таком и сил.
Я точно не монстр из видосов, где экран моргает, код появляется огромными кусками за доли секунды и все сразу зелененькое и пройденное.
А вообще спасибо на добром слове :)

demegorych
25.12.2025 01:54Осенью прочитал тут похожую статью про 600 дней литкода подряд, немного вдохновился и сел решать сам - 47 дней подряд - 84 задачи. У меня было принципиальный подход, что если посмотрел решения = задача решённой не считается.
Первую неделю решал контест ноябрьский, на 8 дней выпала hard задача, которую не смог дооптизимировать для последних тест-кейсов. И спустя 4 часа отложил её, и решил easy/medium. После этого просто выбирал каждый день случайную easy/medium задачу и решал её за 5-40 минут и продолжал стрик. Иногда, брал вторую, если первая совсем скучная.
Недавно продолбал один день, так как в запаре просто забыл решить и немного забросил тему, решив, что буду решать среднюю или сложную, когда "по кайфу". Спойлер за неделю - 0 задач.
Планирую вернуться, но пока не придумал подход, как мне было бы комфортно, интересно, но при этом полезно.

d_ilyich
25.12.2025 01:54На всякий случай, если кто не знал : на литкоде есть квесты. Задачи те же, но отличие в том, что по умолчанию не доступна дискуссия, список тем и подсказки. Монетки там, вроде, дополнительные подкидывают при завершении квеста. Даёт ли прохождение [всех] квестов какие-то ощутимые бонусы - не знаю.

geornit25
25.12.2025 01:54Сильно демотивирует, когда через какое-то время, уже ничего из этих задач не помнишь. В реальной работе эти знания не используются, поэтому надо их постоянно тренировать, чтобы просто не забыть. Как это всё совмещать с работой над реальным проектом и каким-то отдыхом после работы - решительно непонятно.

eugene_october Автор
25.12.2025 01:54поэтому надо их постоянно тренировать
Ну... Я бы тут не согласился. Невозможно находиться всегда на пике формы. Периодически проседать – абсолютно нормально. Перед заходом на цикл собеседований 2-3 недели каждый день нужно порешать, чтобы руку набить. В остальное время можно прокачивать что-нибудь другое

geornit25
25.12.2025 01:54Возможно это индивидуально всё, спорить не буду. В моём случае, надо где-то не реже чем раз в пол-года всё по новой повторять, чтобы не забыть, а это без ясной мотивации довольно проблематично сделать.
Хотя конечно если не целиться на бигтех, где по 5 техсобесов с хард-задачками, которые надо решить без ошибок за минимальное время, то всё попроще. Базовый уровень и основные алгоритмы, думаю вполне можно запомнить надолго.

eugene_october Автор
25.12.2025 01:54Хотя конечно если не целиться на бигтех, где по 5 техсобесов с хард-задачками, которые надо решить без ошибок за минимальное время
На моем опыте обычно medium дают, либо 1 easy и 1 medium. Хард не припомню даже
Базовый уровень и основные алгоритмы, думаю вполне можно запомнить надолго
Мне кажется это основная польза для человека, который не целится в бигтех. А то, что рука местами не набита – и ладно. Как-то что-то где-то все равно решишь при необходимости

eugene_october Автор
25.12.2025 01:54Как это всё совмещать с работой над реальным проектом и каким-то отдыхом после работы - решительно непонятно.
Я, кстати, не знаю, откуда люди берут силы после работы. Я наоборот свеженький с утра делаю что-то для себя, потом работа. Отдыхом так вообще пренебрегать опасное дело
tkutru
Осталось понять, где в работе этот навык пригождается. В большинстве случаев - это чисто флекс для прохождения собесов.
Newbilius
Да и на собесах часто нет, т.к. умению строить архитектуру и правильно декомпозировать задачку на удобные компоненты, насколько видел, leetcode не учит. Если я ошибся и там такое уже тоже появилось - порешал бы с удовольствием)
wataru
Вот где - в фаангах, и в частности, в гугле. Посмотрте, у меня несколько статей на эту тему.
nex-54
Как и многое в жизни - может быть не справедливо, не нравится, но никуда от этого не деться.
Сейчас выбор либо литкод и хорошие оферы, либо не литкод и зарплата в разы меньше. Покарйнемере в северной америке так.
nikolandr
Почему это? Не заморачивался на литкоде и это никак не мешало трудоустраиваться в РФ. Без понятия как там на Западе, это уже на реддит, тут русскоязычный ресурс и в РФ без прорешивания литкода кроме яндекса живётся вполне нормально