Перейти к содержимому

Какие алгоритмы спрашивают на собеседовании

  • автор:

Чтобы решать «нерешаемые» задачи, нужно знать алгоритмы

Артём Мурадов — Senior Software Development Engineer в Amazon и автор курса «Алгоритмы: roadmap для работы и собеседований». Уже больше 14 лет он использует алгоритмы для решения рабочих задач и прохождения собеседований. С помощью алгоритмов он повышал производительность приложений, побеждал в спорах с коллегами и ускорял исследование ДНК. Даже попасть в Amazon ему помогло знание алгоритмов.

Мы пообщались с Артёмом, чтобы узнать о его опыте. Он подробно рассказал, как изучал алгоритмы и как они помогали ему в работе.

Ускорил приложение в 600 раз с помощью алгоритма

2012 год. Я прихожу на работу и узнаю, что система, которую мы писали, медленно запускается. Настолько медленно, что мы даже не можем выпустить релиз.

Ситуацию спас один человек. Он увидел, что в задаче поиска, которая запускается на старте приложения, используется квадратичный алгоритм. Алгоритм работал хорошо на малом объёме данных. Но когда данных стало много, его скорость быстро деградировала. Это стало причиной блокера для релиза.

Тогда меня это поразило: человек просто поменял квадратичный алгоритм на линейный, и всё снова стало прекрасно.

Прошло 5 лет, я оказался в другой компании, где отвечал за приложение, которое сравнивало объекты. Представьте, у вас есть объект №1 с полями, и объект №2 с полями. Вам нужно понять, чем они отличаются. Вы открываете форму, и она показывает разницу между объектами: какие поля добавились или удалились.

В какой-то момент приложение начало долго открываться, что было критично. Невозможно работать, если у тебя обычная форма сравнения объектов открывается 30 минут.

Припоминая историю спасённого релиза, я уже догадывался, в чём может быть дело, и начал смотреть код. Причина оказалась та же — неэффективный алгоритм. Когда приложение создавалось, полей было около 200, алгоритм справлялся. Прошло 10 лет, и количество полей возросло до десятков тысяч. Такие объёмы алгоритму были уже не под силу: он начал работать очень медленно.

Я произвёл ту же замену, что и мой коллега когда-то, — заменил квадратичный алгоритм на линейный. На всё это ушёл один день, и время открытия формы уменьшилось с 30 минут до 3 секунд. Скорость выросла в 600 раз.

За 2 дня сделал то, на что ушло 2 года

Я всегда читал много разных книг по алгоритмам. Особенно меня поразили «Жемчужины программирования» Джона Бентли. По большому счёту, это сборник историй и рассказов о том, как помогают алгоритмы. Одна из историй рассказывала о сортировке подсчётом. Обычно, если ты хочешь отсортировать какие-то вещи, ты предварительно сравниваешь их друг с другом. А особенность сортировки подсчётом в том, что тебе не нужно ничего сравнивать.

В то время я даже не мог представить, что существует такой алгоритм. Мозг взрывался от нового знания, и я пошёл решать задачи. Какие-то давались легко, какие-то сложнее. Наконец, на одной платформе попалась такая, которую никак не получалось решить. Точнее моё решение работало, но было слишком медленным, что, конечно, меня не устраивало.

Шли месяцы, я всё пытался «одолеть» задачу, но она упорно не поддавалась. Теоретически, можно было бы подсмотреть решение в интернете, но я был слишком горд для этого.

В 2014 года я попал на онлайн-курс от Западного университета, где рассказывали про определённую структуру данных и её использование. К тому моменту про структуру данных я уже знал, но никогда не применял её на практике.

Открылась простая истина: недостаточно просто знать алгоритм, нужно понимать, когда его применить.

На курсе рассказали, что «структура данных» — это префиксное дерево, и показали, как с ним работать. Я начал решать примеры, и тут в голове щёлкнуло: «Это ведь та самая задача!». Я потратил ещё 2 дня и наконец-то справился с ней. Проблема была в теоретический базе — как только я её получил, сразу смог найти решение.

Естественно, я бы никому не советовал 2 года решать одну задачу. В то время я был немножко упоротый по алгоритмам — это и помогло не бросить всё на полпути. Но чтобы не тратить столько времени на поиск правильного решения, нужны проверенные источники для обучения.

Пранк вышел из-под контроля: решил нерешаемую задачу

В 2016 году меня пригласили работать в Польшу. Хорошо помню первую задачу в новой компании. Она касалась блоттера.

Блоттер — грид по типу Excel с двумя особенностями. Первая особенность в том, что он держит в памяти только те данные, которые показывает. Предположим, есть таблица с миллионом элементов, из которых видны только 100. Эта сотня — то, что есть прямо сейчас. Всех остальных элементов нет. Когда крутишь блоттер, он начинает запрашивать новые пачки данных, чтобы отображать их.

Вторая особенность — все данные изменяются в реальном времени. Это значит, что в любой момент какие-то строчки могут пропасть, или, наоборот, добавиться.

Мне нужно было сделать так, чтобы, когда пользователь выделял какую-то область в блоттере, а после этого проматывал вверх или вниз, выделенная область сохранялась в памяти. Проблема заключалась в том, что строки постоянно добавлялись, удалялись и обновлялись. Всё это было очень динамично и, разумеется, не сохранялось. Если что-то промотал, всё тут же исчезало.

Я понял, что нужен хитрый алгоритм, который бы находил строчки, которые были выделены, и показывал их, даже когда данные блоттера уже изменились. Провозился с задачей примерно неделю и все-таки решил её.

Но самое интересно дальше — начинаю рассказывать обо всём коллегам, а они только удивляются. Я, естественно, ничего не понимаю, спрашиваю, в чём дело. Тут выясняется, что надо мной просто пошутили. Все в команде уже пытались решить эту задачу, но ни у кого не получилось. И когда пришёл новичок, они просто хотели посмотреть, что он будет делать, столкнувшись с нерешаемой задачей. Правда, шутка вышла из-под контроля. И даже, когда спустя 4 года я уходил из компании, коллеги всё ещё вспоминали эту историю.

Ускорил исследование ДНК в 4000 раз

У меня около 900 ответов на Stack Overflow, из которых больше сотни по алгоритмам. В потоке вопросов я хорошо запомнил один, связанный с ДНК.

ДНК — молекула, которая обеспечивает хранение и передачу информации. Она состоит из нуклеотидов. Каждый нуклеотид содержит сахарную и фосфатную группу, а также азотистые основания. Эти азотистые основания делятся на 4 типа: аденин, тимин, гуанин и цитозин.

Эти же азотистые основания — 4 буквы, отвечающие за определённые позиции в ДНК. А сама ДНК выглядит как последовательность букв, алфавит которых ограничен 4 значениями. Для исследования нужно было обрабатывать миллионы таких последовательностей. Делать это автору вопроса приходилось в полуручном режиме. На то было две причины.

Первая — рабочее приложение принимало только 10 тысяч последовательностей, каждая не длиннее 10 символов. Вторая — это было лицензированное ПО, которое стояло на старом компьютере. Из-за ограничения лицензии его нельзя было перенести не более мощное устройство.

У меня родилась идея, как решить проблему. Если взять две последовательности, которые одинаковы на всех позициях, кроме одной, их можно смёржить в одну. Нужен только специальный символ, который скажет, что это не одна последовательность, а две.

Объясню на примере. У нас есть два имени: «Артем» и «Артём». Пускай, «е» и «ё» — это какая-нибудь спецбуква, например «у». Мы берём «Артём» и «Артем» и мёржим в «Артум». Теперь все, кто будет смотреть на слово «Артум», будут знать, что это два имени, но обрабатывать его смогут как одно.

Благодаря такому варианту сжатия можно было сократить количество последовательностей ДНК до нужного уровня. Допустим, на входе 600 элементов, а на выходе 17. На входе 3 миллиона, а на выходе 150 тысяч.

Я закончил писать алгоритм под свою идею, и автор вопроса опробовал его в действии. Он установил приложение с моим алгоритмом на новый компьютер и запустил обработку 4 миллионов последовательностей по 11 символов. Это было в 450 раз больше, чем могла посчитать его старая программа. Операция заняла 7 секунд. Производительность выросла в 4000 раз.

Я не делал никаких сложных распараллеленных вычислений. Только реализовал одну идею в простом алгоритме, который написал за пару дней. Всё.

История попадания в Amazon

Скажу сразу, Amazon — не единственная крупная компания, куда я пытался устроиться. Я ходил на собеседование в Microsoft, дважды участвовал в отборе в Google. Каждый раз я добирался до финального этапа, но выбор делали в пользу другого кандидата.

Признаюсь, три неудачных собеседования дают повод усомниться в реальности попадания в компанию уровня FAANG. Хотя я и готовился ко встрече с представителем Amazon, шёл туда больше по фану: на других посмотреть, себя показать и шутеечки пошутить.

Прихожу, меня спрашивают: «Ну, что, готов?».

Отвечаю: «Да, погнали. Давай мне алгоритмы, сейчас всё разберём!».

Возможно, дело было в том, что я два раза готовился к собеседованию в Google, два раза участвовал в чемпионате внутри моей компании и вообще был адово нагретый по алгоритмам. Но когда мне задавали задачу, я даже не дослушивал её до конца. Говорил: «Всё, стоп. Я знаю, как решать». И начинал решать. Для некоторых задач даже код не писал — просто объяснял, что нужно сделать.

Когда уходил с собеседования, был в состоянии типа: «А что это было вообще? А где настоящее собеседование? Почему меня не разносят задачами?».

Вскоре со мной связались и сказали, что я прошёл, да ещё и назвали senior. Я тогда удивился, но сейчас понимаю, что это закономерно. Каждое новое собеседование добавляло мне опыта и развивало.

Я шёл трудным путём: сам составлял себе программу обучения, сам всё учил, сам выбирал задачи и решал их без помощи извне. В Microsoft я подался в 2012 году, а работать в Amazon начал только в 2020 году. За 8 лет у меня было 4 собеседования в FAANG, 3 из которых прошли неуспешно.

Когда я рассказал на прошлой работе, что прошёл собеседование в Amazon, меня сразу стали спрашивать, что там и как. И спрашивали так часто, что пришлось сделать шпаргалку, которую я просто копипастил и отправлял всем интересующимся. Но это было не напрасно — те, кто воспользовался моими рекомендациями, теперь работают там, где мечтали.

Всех, кто хочет погрузиться в тему алгоритмов, приглашаем на экспресс-курс «Алгоритмы: roadmap для работы и собеседований». Вы узнаете, как алгоритмы помогают в работе и на собеседованиях и получите проверенные ресурсы для их изучения.

18 лучших вопросов и ответов на собеседовании по алгоритмам (2024 г.)

Вот вопросы и ответы на собеседовании по алгоритму для новичков и опытных кандидатов, желающих получить работу своей мечты.

Вопросы и ответы по алгоритму для начинающих

1) Объясните, что такое алгоритм в вычислениях?

Алгоритм — это четко определенная вычислительная процедура, которая принимает некоторое значение в качестве входных данных и генерирует некоторое значение в качестве выходных данных. Проще говоря, это последовательность вычислительных шагов, которая преобразует входные данные в выходные.

2) Объясните, что такое алгоритм быстрой сортировки?

Алгоритм быстрой сортировки позволяет быстро сортировать список или запросы. Он основан на принципе сортировки обмена разделами или разделяй и властвуй. Этот тип алгоритма занимает меньше места и разделяет список на три основные части.

  • Элементы меньше элемента Pivot
  • Поворотный элемент
  • Элементы, превышающие элемент Pivot

3) Объясните, сколько времени.plexность алгоритма?

команда сplexКачество алгоритма указывает общее время, необходимое программе для завершения. Обычно это выражается с помощью большое обозначение О.

4) Укажите, какие типы обозначений используются для Time Com.plexность?

Типы обозначений, используемых для Time Complexвключает в себя

  • Большой О: Это означает «меньше или столько же, как» итерации
  • Большой Оmega: Это означает «больше или то же самое, что» итерации
  • Большая Тета: Это означает «то же самое, что и» итерации
  • Маленький Ой: Это означает «меньше чем» итерации
  • Маленький Оmega: Обозначает «более чем» итерации

5) Объясните, как работает бинарный поиск?

In бинарный поиск, мы сравниваем ключ с элементом в средней позиции массива. Если ключ меньше искомого элемента, то он должен находиться в нижней половине массива, если ключ больше искомого элемента, чем он должен находиться в верхней половине массива.

Вопросы для собеседования по алгоритму

6) Объясните, можно ли использовать бинарный поиск по связанным спискам?

Поскольку произвольный доступ неприемлем в связанном списке, невозможно достичь среднего элемента за время O(1). Таким образом, двоичный поиск для связанного списка невозможен.

7) Объясните, что такое пирамидальная сортировка?

Сортировка кучей может быть определен как алгоритм сортировки на основе сравнения. Он делит входные данные на несортированную и отсортированную область до тех пор, пока не сжимает несортированную область, удаляя наименьший элемент и перемещая его в отсортированную область.

8) Объясните, что такое список пропуска?

Пропустить список — метод структурирования данных, позволяющий алгоритму искать, удалять и вставлять элементы в таблицу символов или словарь. В списке пропуска каждый элемент представлен узлом. Функция поиска возвращает содержимое значения, связанного с ключом. Операция вставки связывает указанный ключ с новым значением, а функция удаления удаляет указанный ключ.

9) Объясните, что такое Spacecom.plexность алгоритма сортировки вставками?

Сортировка вставками — это алгоритм сортировки на месте, что означает, что для него не требуется ничего лишнего или мало. хранилище. Для сортировки вставкой требуется, чтобы за пределами исходных данных хранились только отдельные элементы списка.plexность 0(1).

10) Объясните, что такое «алгоритм хеширования» и для чего он используется?

«Алгоритм хеширования» — это хеш-функция, которая принимает строку любой длины и уменьшает ее до уникальной строки фиксированной длины. Он используется для проверки достоверности пароля, целостности сообщений и данных, а также для многих других криптографических систем.

Вопросы и ответы на собеседовании по алгоритму для опытных

11) Объясните, как узнать, есть ли в связанном списке цикл?

Чтобы узнать, есть ли в связанном списке цикл, мы воспользуемся подходом с двумя указателями. Если мы поддерживаем два указателя и увеличиваем один указатель после обработки двух узлов, а другой — после обработки каждого узла, мы, скорее всего, столкнемся с ситуацией, когда оба указателя будут указывать на один и тот же узел. Это произойдет только в том случае, если связанный список имеет цикл.

12) Объясните, как работает алгоритм шифрования?

Шифрование — это процесс преобразования открытого текста в формат секретного кода, называемый «Зашифрованный текст». Для преобразования текста алгоритм использует строку битов, называемую «ключами» для вычислений. Чем больше ключ, тем больше потенциальных шаблонов для создания зашифрованного текста. Большинство алгоритмов шифрования используют фиксированные входные блоки кодов длиной от 64 до 128 бит, а некоторые используют потоковый метод.

13) Перечислите некоторые из наиболее часто используемых криптографических алгоритмов?

Некоторые из наиболее часто используемых криптографических алгоритмов:

  • 3-полосная
  • Blowfish
  • БРОСАТЬ
  • СЭВ
  • ГОСТ
  • DES и тройной DES
  • ИДЕЯ
  • ЛОКИ и так далее

14) Объясните, в чем разница между лучшим сценарием и худшим сценарием алгоритма?

  • Лучший сценарий: Наилучший сценарий для алгоритма объясняется расположением данных, при котором алгоритм работает лучше всего. Например, мы возьмем двоичный поиск, для которого лучшим сценарием будет, если целевое значение находится в самом центре искомых данных. Лучшее время, комplexзначение будет 0 (1)
  • Худший вариант: Это худший набор входных данных для данного алгоритма. Например быстрая сортировка, что может привести к худшей производительности, если в качестве сводного значения вы выберете самый большой или наименьший элемент подсписка. Это приведет к вырождению быстрой сортировки до O (n2).

15) Объясните, что такое алгоритм поразрядной сортировки?

Сортировка по основанию приводит элемент в порядок, сравнивая цифры чисел. Это один из алгоритмов линейной сортировки целых чисел.

16) Объясните, что такое рекурсивный алгоритм?

Рекурсивный алгоритм — это метод решения сложной проблемы путем разбиения проблемы на все более мелкие подзадачи, пока проблема не станет достаточно маленькой, чтобы ее можно было легко решить. Обычно это включает в себя функцию calling itself .

17) Назовите три закона алгоритма рекурсии?

Любой рекурсивный алгоритм должен следовать трем законам

  • Он должен иметь базовый вариант
  • Рекурсивный алгоритм должен вызывать сам себя
  • Рекурсивный алгоритм должен изменить свое состояние и перейти к базовому случаю.

18) Объясните, что такое алгоритм пузырьковой сортировки?

Алгоритм пузырьковой сортировки также называется тонущей сортировкой. При этом типе сортировки список, подлежащий сортировке, составляетares пара соседних предметов. Если они организованы в неправильном порядке, значения поменяются местами и расположится в правильном порядке.

Эти вопросы для собеседования также помогут вам в устной речи.

  • Учебное пособие по DAA в формате PDF: Разработка и анализ алгоритмов
  • Алгоритм пирамидальной сортировки (с кодом на Python и C++)
  • Алгоритм Каденса: непрерывный подмассив наибольшей суммы
  • Алгоритм поразрядной сортировки в структуре данных
  • Двусвязный список: C++, Python (пример кода)
  • Односвязный список в структурах данных
  • Алгоритм простых коэффициентов: C, пример Python
  • Алгоритм Ханойской башни: Python, код C++

8 базовых алгоритмических задач на собеседованиях

Во время собеседования на должность в IT-сфере часто касаются вопросов применения алгоритмов. Наиболее популярными являются алгоритмы поиска и сортировки (строковые алгоритмы, бинарный поиск, алгоритм поиска на графах). Несмотря на кажущуюся простоту, они бывают коварны и трудны в реализации под конкретную задачу. Вот почему важно заранее отработать принцип применения каждого алгоритма, а не полагаться на слепую удачу. Чем лучше вы поймёте схему работы, чем подробнее сможете описать решение данных вам задач, тем выше будут шансы на успешное прохождение собеседования.

Будьте готовы к хитрым вопросам и решению проблем альтернативными способами. Например, часто просят вместо рекурсии разобрать задачу через итеративный алгоритм.

Реализуйте алгоритм бинарного поиска

Бинарный поиск — это алгоритм, следующий парадигме «разделяй и властвуй»: задача разбивается на подзадачи. Этот алгоритм поиска удобен, если нужно найти число в массиве простых чисел или элемент в списке. Самый простой способ решения — при помощи рекурсии.

Важно: бинарный поиск возможен, только если массив данных отсортирован.

Реализуйте сортировку пузырьком

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

Временная сложность — O(n²), из-за которого алгоритм подходит только для небольшого объёма данных.

Разница между устойчивой и неустойчивой сортировкой

При устойчивой сортировке не меняется относительный порядок сортируемых элементов, имеющих одинаковые ключи, при неустойчивой — меняется. Например, алгоритм быстрой сортировки — неустойчивый, алгоритм сортировки слиянием — устойчивый.

Как поменять местами два значения переменных без третьей переменной?

Еще один вопрос с подвохом, который на самом деле очень прост. Вы можете поменять местами два числа, не прибегая к временной или третьей переменной, если присвоите одной переменной значение суммы двух чисел, а потом вычтите из этой суммы значение для каждой из переменных. Пример:

a = 3;
b = 5;
a = a + b; // 8
b = a - b; // 3
a = a - b; // 5

Как реализуется поразрядная сортировка?

Алгоритм с временной сложностью О(n). Согласно википедии, поразрядная сортировка это алгоритм сортировки, не требующий сравнения. Он обрабатывает данные с целочисленными ключами путём группирования ключей в соответствии с индивидуальными разрядами, которые разделяют ту же позицию и значение.

Как реализовать алгоритм сортировки вставкой?

Принцип схож с сортированием колоды или одежды в шкафу. Каждая карта ложится на свое место, иначе говоря, каждый последующий элемент добавляется на определенную позицию.

Как реализовать сортировку слиянием?

Как в случае с быстрой сортировкой, этот метод относят к группе «разделяй и властвуй». Например, чтобы отсортировать массив чисел, вы его разделите на небольшие части, пока не останется массив в один или ноль отсортированных элементов. Далее следует объединить малые массивы, чтобы получить финальный результат.

Стоит отметить, что в сравнении с быстрой сортировкой данный алгоритм обрабатывает элементы медленнее.

Реализуйте алгоритм быстрой сортировки на предпочитаемом языке программирования

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

  • Анализ независимых компонент в Python
  • Строковые методы в Python
  • 10 внешних Python-пакетов, которые вам точно понравятся

Грокаем алгоритмы: Гайд по алгоритмам для тех, кому сложно решать задачи

Грокаем алгоритмы: Гайд по алгоритмам для тех, кому сложно решать задачи главное изображение

Эта статья — для разработчиков, которые частично уже знают алгоритмы. Если вы еще не знакомы с ними, советуем пройти трек «Алгоритмы и структуры данных» в Хекслете. Вы изучите списки, стеки, очереди, структуры данных, которые помогут проектировать структуры и алгоритмы.

Бесплатные курсы по программированию в Хекслете

  • Освойте азы современных языков программирования
  • Изучите работу с Git и командной строкой
  • Выберите себе профессию или улучшите навыки

Грокать алгоритмы или не грокать? Что делать, если вам не хочется решать сто задач к вашему следующему собеседованию?

Часть меня ненавидит технические собеседования, в первую очередь из-за того, что мне нужно повторять много материала. Кроме того, в процессе самого собеседования мне часто приходится предлагать какое-то особенное решение, а не то, которое я бы выбрал в своей будничной практике.

Несмотря на это, я люблю алгоритмы и люблю решать задачки по программированию. Для меня это веселое времяпровождение и хорошая тренировка для мозга. Учитывая все это, хочу рассказать вам о моей собственной технике подготовки к собеседованиям, которая намного интереснее и волнительнее, чем обычная подготовка.

Коротко расскажу о себе, чтобы вы убедились в моей экспертности. Я программирую уже 20 лет, за это время я много раз менял место работы. Всего я прошел около 30 воронок найма — больше 120 собеседований. Плюс к этому у меня есть опыт с той стороны баррикад: я провел около 300 технических собеседований и больше 200 собеседований по системному дизайну .

Где мы грокаем алгоритмы

Если вы когда-нибудь искали работу, то знаете, что есть ресурсы, которые собирают задачи с собеседований . Один из них — LeetCode, это самый популярный сайт, где очень много задач. Плюс вокруг него сложилось развитое сообщество, где можно обсуждать задачки с другими инженерами. Если выдается свободная минутка, я всегда не прочь провести ее на LeetCode. Там я решаю задачи или читаю чужие решения, после чего сравниваю со своими.

Самая большая проблема LeetCode в том, что сайту не хватает продуманной системы обучения. У него много разных задач, в которых легко потеряться. Сколько нужно таких задач, чтобы подготовиться к собеседованию? Я бы предпочел двигаться по продуманной программе, в конце которой я смогу ощутить уверенность в собственных знаниях. Но системы нет, а я ленивый, и вообще — не хочу решать 500+ задач.

Одно из популярных решений для этой проблемы — решать задачи, которые относятся к одной структуре данных (например, прорешать несколько задач с деревьями). Какая-то система обучения появляется, но это решение меня все равно не устраивает. Например, что делать, если задачу можно решить при помощи разных структур данных?

Какую систему обучения придумал я

Я бы предпочел такую систему, в которой задачи распределены по паттернам, а не по структурам данных. Мои любимые паттерны — скользящее окно, нахождение цикла и топологическая сортировка. Когда я научился пользоваться этими методами, я стал решать незнакомые задачи по аналогии с задачами, которые решал до этого. Благодаря этому весь процесс подготовки к собеседованиям стал более интересным и веселым. Ну и конечно же, более систематичным.

Я обнаружил 25 паттернов, которые лежат в основе решения большинства задач. Думаю, эти паттерны помогут кому угодно показывать на собеседованиях красивые и элегантные решения. Вся фишка этих паттернов в том, что понимая один из них, вы научитесь решать сразу несколько задач, десятки задач.

Самые распространенные паттерны для решения задач

  1. Метод скользящего окна
  2. Метод двух указателей
  3. Нахождение цикла
  4. Интервальное слияние
  5. Цикличная сортировка
  6. In-place Reversal для LinkedList
  7. Поиск в ширину
  8. Поиск в глубину
  9. Двоичная куча
  10. Подмножества
  11. Усовершенствованный бинарный поиск
  12. Побитовое исключающее ИЛИ
  13. Top K Elements
  14. K-образное слияние
  15. Задача о рюкзаке 0-1
  16. Задача о неограниченном рюкзаке
  17. Числа Фибоначчи
  18. Наибольшая последовательность-палиндром
  19. Наибольшая общая подстрока
  20. Топологическая сортировка
  21. Чтение префиксного дерева
  22. Задача: количество островов в матрице
  23. Метод проб и ошибок
  24. Система непересекающихся множеств
  25. Задача: найти уникальные маршруты

Читайте также: Это снова я, резиновая уточка: что такое метод Фейнмана и почему с его помощью так просто изучать программирование

Метод скользящего окна

Контекст: Мы используем этот метод, когда у нас есть входные данные с заданным размером окна.

Задачи для этого паттерна:

  • Longest Substring with K Distinct Characters
  • Fruits into Baskets
  • Permutation in a String

Метод двух указателей

Контекст: Мы используем два указателя, чтобы перебрать все входные данные. Обычно два указателя движутся в противоположных направлениях с фиксированным интервалом.

Задачи для этого паттерна:

  • Squaring a Sorted Array
  • Dutch National Flag Problem
  • Minimum Window Sort

Нахождение цикла

Контекст: Еще этот алгоритм называют алгоритмом черепахи и зайца. В отличие от предыдущего метода, два указателя тут движутся с разной скоростью.

Задачи для этого паттерна:

  • Middle of the LinkedList
  • Happy Number
  • Cycle in a Circular Array

Интервальное слияние

Контекст: Этот метод применяют, если есть пересекающиеся интервалы. Например, на этом изображении мы видим, что интервалы a и b могут пересекаться шестью разными способами:

Задачи для этого паттерна:

  • Intervals Intersection
  • Conflicting Appointments
  • Minimum Meeting Rooms

Цикличная сортировка

Контекст: Если входные данные лежат в заданном интервале, используйте цикличную сортировку.

Задачи для этого паттерна:

  • Find all Missing Numbers
  • Find all Duplicate Numbers
  • Find the First K Missing Positive Numbers

In-place Reversal для LinkedList

Техника: Эта техника описывает эффективный способ перевернуть связи между узлами в LinkedList (класс Java). Часто мы ограничены in-place, то есть мы должны использовать исходные узлы.

Задачи для этого паттерна:

  • Reverse every K-element Sub-list
  • Rotate a LinkedList

Поиск в ширину

Контекст: Это метод для решения задач с деревьями.

Задачи для этого паттерна:

  • Binary Tree Level Order Traversal
  • Minimum Depth of a Binary Tree
  • Connect Level Order Siblings

Поиск в глубину

Контекст: Тот же, что для предыдущего метода.

Задачи для этого паттерна:

  • Path With Given Sequence
  • Count Paths for a Sum

Двоичная куча

Контекст: Во многих задачах у нас есть набор элементов, который можно разделить на две части. Тогда мы могли бы выяснить, какой элемент является наименьшим в первой куче и какой является наибольшим во второй куче.

Задачи для этого паттерна:

  • Find the Median of a Number Stream
  • Next Interval

Подмножества

Контекст: Если задача требует перестановки или комбинаций элементов, используйте подмножества.

Задачи для этого паттерна:

  • String Permutations by changing case
  • Unique Generalized Abbreviations

Усовершенствованный бинарный поиск

Контекст: Эта техника использует логический оператор для наиболее эффективного поиска элементов.

Задачи для этого паттерна:

  • Two Single Numbers
  • Flip and Invert an Image

Наибольшее K элементов

Контекст: Эта техника используется, чтобы найти наибольший/наименьший или наиболее часто встречающийся набор k-элементов в коллекции.

Задачи для этого паттерна:

  • ‘K’ Closest Points to the Origin
  • Maximum Distinct Elements

Читайте также: Как решить задачу, если непонятно, с чего вообще начать: советы от Хекслета

K-образное слияние

Контекст: Используйте эту технику, если у вас есть список отсортированных массивов.

Задачи для этого паттерна:

  • Kth Smallest Number in M Sorted Lists
  • Kth Smallest Number in a Sorted Matrix

Рюкзак 0-1

Контекст: Этот паттерн используют для задач на оптимизацию. Используйте эту технику, чтобы выбирать элементы, которые дают максимум выгоды в данном наборе ограничений по вместимости. Учитывая то, что каждый элемент может быть выбран лишь единожды.

Задачи для этого паттерна:

  • Equal Subset Sum Partition
  • Minimum Subset Sum Difference

Неограниченный рюкзак

Контекст: То же самое, что в предыдущем паттерне, но только каждый элемент может быть выбран повторно сколько угодно раз.

Задачи для этого паттерна:

  • Rod Cutting
  • Coin Change

Числа Фибоначчи

Контекст: Как очевидно из названия, это паттерн для чисел Фибоначчи. Это последовательность, в которой каждое последующее число равно сумме двух предыдущих чисел.

Задачи для этого паттерна:

Наибольшая последовательность — палиндром

Контекст: Имеется в виду задача, которая может быть использована как для последовательности, так и для строк . По сути это задача на оптимизацию.

Задачи для этого паттерна:

  • Longest Palindromic Subsequence
  • Minimum Deletions in a String to make it a Palindrome

Наибольшая общая подстрока

Контекст: Как понятно из названия, это паттерн для работы со строками или другими последовательностями, а также для работы с наборами строк или последовательностей.

Задачи для этого паттерна:

  • Maximum Sum Increasing Subsequence
  • Edit Distance

Чтение префиксного дерева

Контекст: Это специфичная для структуры данных техника, с помощью которой читают или создают префиксное дерево.

Задачи для этого паттерна:

  • Longest Word in Dictionary
  • Palindrome Pairs

Острова в матрице

Контекст: Этот паттерн подходит для чтения любого двумерного массива, где нам нужно обнаружить связанные между собой элементы.

Задачи для этого паттерна:

  • Number of Distinct Islands
  • Maximum Area of Island

Путь проб и ошибок

Контекст: Этот паттерн подойдет для того, чтобы пройтись по массиву в поисках подходящего под требования элемента.

Задачи для этого паттерна:

  • Find Kth Smallest Pair Distance
  • Minimize Max Distance to Gas Station

Система непересекающихся множеств

Контекст: Если данные раскиданы по непересекающимся множествам, то они решаются одним и тем же способом.

Задачи для этого паттерна:

  • Number of Provinces
  • Bipartite Graph

Поиск уникального маршрута

Контекст: Этот паттерн подойдет для прохождения по любому многомерному массиву.

Задачи для этого паттерна:

  • Find Unique Paths
  • Dungeon Game

Бесплатные курсы по программированию в Хекслете

  • Освойте азы современных языков программирования
  • Изучите работу с Git и командной строкой
  • Выберите себе профессию или улучшите навыки

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *