1 added
1 removed
Original
2026-01-01
Modified
2026-02-26
1
<p><strong>Рассказываем, какие алгоритмы учить к собеседованиям и что делать, если решать алгоритмические задачи вам просто скучно.</strong></p>
1
<p><strong>Рассказываем, какие алгоритмы учить к собеседованиям и что делать, если решать алгоритмические задачи вам просто скучно.</strong></p>
2
<p><em>Это адаптированный перевод статьи<a>Grokking LeetCode: A Smarter Way to Prepare for Coding Interviews</a>, автор -<a><em>Арслан Ахмад</em></a>. Повествование ведется от имени автора.</em></p>
2
<p><em>Это адаптированный перевод статьи<a>Grokking LeetCode: A Smarter Way to Prepare for Coding Interviews</a>, автор -<a><em>Арслан Ахмад</em></a>. Повествование ведется от имени автора.</em></p>
3
<blockquote><p>Эта статья - для разработчиков, которые частично уже знают алгоритмы. Если вы еще не знакомы с ними, советуем пройти трек "<a>Алгоритмы и структуры данных</a>" в Хекслете. Вы изучите списки, стеки, очереди, структуры данных, которые помогут проектировать структуры и алгоритмы.</p>
3
<blockquote><p>Эта статья - для разработчиков, которые частично уже знают алгоритмы. Если вы еще не знакомы с ними, советуем пройти трек "<a>Алгоритмы и структуры данных</a>" в Хекслете. Вы изучите списки, стеки, очереди, структуры данных, которые помогут проектировать структуры и алгоритмы.</p>
4
</blockquote><p><a>Грокать алгоритмы или не грокать</a>? Что делать, если вам не хочется решать сто задач к вашему следующему собеседованию?</p>
4
</blockquote><p><a>Грокать алгоритмы или не грокать</a>? Что делать, если вам не хочется решать сто задач к вашему следующему собеседованию?</p>
5
<p>Часть меня ненавидит технические собеседования, в первую очередь из-за того, что мне нужно повторять много материала. Кроме того, в процессе самого собеседования мне часто приходится предлагать какое-то особенное решение, а не то, которое я бы выбрал в своей будничной практике.</p>
5
<p>Часть меня ненавидит технические собеседования, в первую очередь из-за того, что мне нужно повторять много материала. Кроме того, в процессе самого собеседования мне часто приходится предлагать какое-то особенное решение, а не то, которое я бы выбрал в своей будничной практике.</p>
6
<p>Несмотря на это, я люблю алгоритмы и люблю решать задачки по программированию. Для меня это веселое времяпровождение и хорошая тренировка для мозга. Учитывая все это, хочу рассказать вам о моей собственной технике подготовки к собеседованиям, которая намного интереснее и волнительнее, чем обычная подготовка.</p>
6
<p>Несмотря на это, я люблю алгоритмы и люблю решать задачки по программированию. Для меня это веселое времяпровождение и хорошая тренировка для мозга. Учитывая все это, хочу рассказать вам о моей собственной технике подготовки к собеседованиям, которая намного интереснее и волнительнее, чем обычная подготовка.</p>
7
<p>Коротко расскажу о себе, чтобы вы убедились в моей экспертности. Я программирую уже 20 лет, за это время я много раз менял место работы. Всего я прошел около 30 воронок найма - больше 120 собеседований. Плюс к этому у меня есть опыт с той стороны баррикад: я провел около 300 технических собеседований и больше 200 собеседований по<a>системному дизайну</a>.</p>
7
<p>Коротко расскажу о себе, чтобы вы убедились в моей экспертности. Я программирую уже 20 лет, за это время я много раз менял место работы. Всего я прошел около 30 воронок найма - больше 120 собеседований. Плюс к этому у меня есть опыт с той стороны баррикад: я провел около 300 технических собеседований и больше 200 собеседований по<a>системному дизайну</a>.</p>
8
<h2>Содержание</h2>
8
<h2>Содержание</h2>
9
<ul><li><a>Где мы грокаем алгоритмы</a></li>
9
<ul><li><a>Где мы грокаем алгоритмы</a></li>
10
<li><a>Какую систему обучения придумал я</a></li>
10
<li><a>Какую систему обучения придумал я</a></li>
11
<li><a>Самые распространенные паттерны для решения задач</a></li>
11
<li><a>Самые распространенные паттерны для решения задач</a></li>
12
</ul><h2>Где мы грокаем алгоритмы</h2>
12
</ul><h2>Где мы грокаем алгоритмы</h2>
13
<p>Если вы когда-нибудь искали работу, то знаете, что есть ресурсы, которые<a>собирают задачи с собеседований</a>. Один из них - LeetCode, это самый популярный сайт, где очень много задач. Плюс вокруг него сложилось развитое сообщество, где можно обсуждать задачки с другими инженерами. Если выдается свободная минутка, я всегда не прочь провести ее на LeetCode. Там я решаю задачи или читаю чужие решения, после чего сравниваю со своими.</p>
13
<p>Если вы когда-нибудь искали работу, то знаете, что есть ресурсы, которые<a>собирают задачи с собеседований</a>. Один из них - LeetCode, это самый популярный сайт, где очень много задач. Плюс вокруг него сложилось развитое сообщество, где можно обсуждать задачки с другими инженерами. Если выдается свободная минутка, я всегда не прочь провести ее на LeetCode. Там я решаю задачи или читаю чужие решения, после чего сравниваю со своими.</p>
14
<p>Самая большая проблема LeetCode в том, что сайту не хватает продуманной системы обучения. У него много разных задач, в которых легко потеряться. Сколько нужно таких задач, чтобы подготовиться к собеседованию? Я бы предпочел двигаться по продуманной программе, в конце которой я смогу ощутить уверенность в собственных знаниях. Но системы нет, а я ленивый, и вообще - не хочу решать 500+ задач.</p>
14
<p>Самая большая проблема LeetCode в том, что сайту не хватает продуманной системы обучения. У него много разных задач, в которых легко потеряться. Сколько нужно таких задач, чтобы подготовиться к собеседованию? Я бы предпочел двигаться по продуманной программе, в конце которой я смогу ощутить уверенность в собственных знаниях. Но системы нет, а я ленивый, и вообще - не хочу решать 500+ задач.</p>
15
<p>Одно из популярных решений для этой проблемы - решать задачи, которые относятся к одной структуре данных (например, прорешать несколько задач с деревьями). Какая-то система обучения появляется, но это решение меня все равно не устраивает. Например, что делать, если задачу можно решить при помощи разных структур данных?</p>
15
<p>Одно из популярных решений для этой проблемы - решать задачи, которые относятся к одной структуре данных (например, прорешать несколько задач с деревьями). Какая-то система обучения появляется, но это решение меня все равно не устраивает. Например, что делать, если задачу можно решить при помощи разных структур данных?</p>
16
<h2>Какую систему обучения придумал я</h2>
16
<h2>Какую систему обучения придумал я</h2>
17
<p>Я бы предпочел такую систему, в которой задачи распределены по паттернам, а не по структурам данных. Мои любимые паттерны - скользящее окно, нахождение цикла и топологическая сортировка. Когда я научился пользоваться этими методами, я стал решать незнакомые задачи по аналогии с задачами, которые решал до этого. Благодаря этому весь процесс подготовки к собеседованиям стал более интересным и веселым. Ну и конечно же, более систематичным.</p>
17
<p>Я бы предпочел такую систему, в которой задачи распределены по паттернам, а не по структурам данных. Мои любимые паттерны - скользящее окно, нахождение цикла и топологическая сортировка. Когда я научился пользоваться этими методами, я стал решать незнакомые задачи по аналогии с задачами, которые решал до этого. Благодаря этому весь процесс подготовки к собеседованиям стал более интересным и веселым. Ну и конечно же, более систематичным.</p>
18
<p>Я обнаружил 25 паттернов, которые лежат в основе решения большинства задач. Думаю, эти паттерны помогут кому угодно показывать на собеседованиях красивые и элегантные решения. Вся фишка этих паттернов в том, что понимая один из них, вы научитесь решать сразу несколько задач, десятки задач.</p>
18
<p>Я обнаружил 25 паттернов, которые лежат в основе решения большинства задач. Думаю, эти паттерны помогут кому угодно показывать на собеседованиях красивые и элегантные решения. Вся фишка этих паттернов в том, что понимая один из них, вы научитесь решать сразу несколько задач, десятки задач.</p>
19
<h2>Самые распространенные паттерны для решения задач</h2>
19
<h2>Самые распространенные паттерны для решения задач</h2>
20
<ol><li><a>Метод скользящего окна</a></li>
20
<ol><li><a>Метод скользящего окна</a></li>
21
<li><a>Метод двух указателей</a></li>
21
<li><a>Метод двух указателей</a></li>
22
<li><a>Нахождение цикла</a></li>
22
<li><a>Нахождение цикла</a></li>
23
<li><a>Интервальное слияние</a></li>
23
<li><a>Интервальное слияние</a></li>
24
<li><a>Цикличная сортировка</a></li>
24
<li><a>Цикличная сортировка</a></li>
25
<li><a>In-place Reversal для LinkedList</a></li>
25
<li><a>In-place Reversal для LinkedList</a></li>
26
<li><a>Поиск в ширину</a></li>
26
<li><a>Поиск в ширину</a></li>
27
<li><a>Поиск в глубину</a></li>
27
<li><a>Поиск в глубину</a></li>
28
<li><a>Двоичная куча</a></li>
28
<li><a>Двоичная куча</a></li>
29
<li><a>Подмножества</a></li>
29
<li><a>Подмножества</a></li>
30
<li>Усовершенствованный<a>бинарный поиск</a></li>
30
<li>Усовершенствованный<a>бинарный поиск</a></li>
31
<li><a>Побитовое исключающее ИЛИ</a></li>
31
<li><a>Побитовое исключающее ИЛИ</a></li>
32
<li><a>Top<em>K</em>Elements</a></li>
32
<li><a>Top<em>K</em>Elements</a></li>
33
<li><a>K-образное слияние</a></li>
33
<li><a>K-образное слияние</a></li>
34
<li><a>Задача о рюкзаке 0-1</a></li>
34
<li><a>Задача о рюкзаке 0-1</a></li>
35
-
<li><a>Задача о неог��аниченном рюкзаке</a></li>
35
+
<li><a>Задача о неограниченном рюкзаке</a></li>
36
<li><a>Числа Фибоначчи</a></li>
36
<li><a>Числа Фибоначчи</a></li>
37
<li><a>Наибольшая последовательность-палиндром</a></li>
37
<li><a>Наибольшая последовательность-палиндром</a></li>
38
<li><a>Наибольшая общая подстрока</a></li>
38
<li><a>Наибольшая общая подстрока</a></li>
39
<li><a>Топологическая сортировка</a></li>
39
<li><a>Топологическая сортировка</a></li>
40
<li>Чтение<a>префиксного дерева</a></li>
40
<li>Чтение<a>префиксного дерева</a></li>
41
<li>Задача:<a>количество островов в матрице</a></li>
41
<li>Задача:<a>количество островов в матрице</a></li>
42
<li><a>Метод проб и ошибок</a></li>
42
<li><a>Метод проб и ошибок</a></li>
43
<li><a>Система непересекающихся множеств</a></li>
43
<li><a>Система непересекающихся множеств</a></li>
44
<li>Задача:<a>найти уникальные маршруты</a></li>
44
<li>Задача:<a>найти уникальные маршруты</a></li>
45
</ol><h3>Метод скользящего окна</h3>
45
</ol><h3>Метод скользящего окна</h3>
46
<p><strong>Контекст:</strong>Мы используем этот метод, когда у нас есть входные данные с заданным размером окна.</p>
46
<p><strong>Контекст:</strong>Мы используем этот метод, когда у нас есть входные данные с заданным размером окна.</p>
47
<p><strong>Задачи для этого паттерна:</strong></p>
47
<p><strong>Задачи для этого паттерна:</strong></p>
48
<ul><li><a>Longest Substring with K Distinct Characters</a></li>
48
<ul><li><a>Longest Substring with K Distinct Characters</a></li>
49
<li><a>Fruits into Baskets</a></li>
49
<li><a>Fruits into Baskets</a></li>
50
<li><a>Permutation in a String</a></li>
50
<li><a>Permutation in a String</a></li>
51
</ul><h3>Метод двух указателей</h3>
51
</ul><h3>Метод двух указателей</h3>
52
<p><strong>Контекст:</strong>Мы используем два указателя, чтобы перебрать все входные данные. Обычно два указателя движутся в противоположных направлениях с фиксированным интервалом.</p>
52
<p><strong>Контекст:</strong>Мы используем два указателя, чтобы перебрать все входные данные. Обычно два указателя движутся в противоположных направлениях с фиксированным интервалом.</p>
53
<p><strong>Задачи для этого паттерна:</strong></p>
53
<p><strong>Задачи для этого паттерна:</strong></p>
54
<ul><li><a>Squaring a Sorted Array</a></li>
54
<ul><li><a>Squaring a Sorted Array</a></li>
55
<li><a>Dutch National Flag Problem</a></li>
55
<li><a>Dutch National Flag Problem</a></li>
56
<li><a>Minimum Window Sort</a></li>
56
<li><a>Minimum Window Sort</a></li>
57
</ul><h3>Нахождение цикла</h3>
57
</ul><h3>Нахождение цикла</h3>
58
<p><strong>Контекст:</strong>Еще этот алгоритм называют алгоритмом черепахи и зайца. В отличие от предыдущего метода, два указателя тут движутся с разной скоростью.</p>
58
<p><strong>Контекст:</strong>Еще этот алгоритм называют алгоритмом черепахи и зайца. В отличие от предыдущего метода, два указателя тут движутся с разной скоростью.</p>
59
<p><strong>Задачи для этого паттерна:</strong></p>
59
<p><strong>Задачи для этого паттерна:</strong></p>
60
<ul><li><a>Middle of the LinkedList</a></li>
60
<ul><li><a>Middle of the LinkedList</a></li>
61
<li><a>Happy Number</a></li>
61
<li><a>Happy Number</a></li>
62
<li><a>Cycle in a Circular Array</a></li>
62
<li><a>Cycle in a Circular Array</a></li>
63
</ul><h3>Интервальное слияние</h3>
63
</ul><h3>Интервальное слияние</h3>
64
<p><strong>Контекст:</strong>Этот метод применяют, если есть пересекающиеся интервалы. Например, на этом изображении мы видим, что интервалы a и b могут пересекаться шестью разными способами:</p>
64
<p><strong>Контекст:</strong>Этот метод применяют, если есть пересекающиеся интервалы. Например, на этом изображении мы видим, что интервалы a и b могут пересекаться шестью разными способами:</p>
65
<p><strong>Задачи для этого паттерна:</strong></p>
65
<p><strong>Задачи для этого паттерна:</strong></p>
66
<ul><li><a>Intervals Intersection</a></li>
66
<ul><li><a>Intervals Intersection</a></li>
67
<li><a>Conflicting Appointments</a></li>
67
<li><a>Conflicting Appointments</a></li>
68
<li><a>Minimum Meeting Rooms</a></li>
68
<li><a>Minimum Meeting Rooms</a></li>
69
</ul><h3>Цикличная сортировка</h3>
69
</ul><h3>Цикличная сортировка</h3>
70
<p><strong>Контекст:</strong>Если входные данные лежат в заданном интервале, используйте цикличную сортировку.</p>
70
<p><strong>Контекст:</strong>Если входные данные лежат в заданном интервале, используйте цикличную сортировку.</p>
71
<p><strong>Задачи для этого паттерна:</strong></p>
71
<p><strong>Задачи для этого паттерна:</strong></p>
72
<ul><li><a>Find all Missing Numbers</a></li>
72
<ul><li><a>Find all Missing Numbers</a></li>
73
<li><a>Find all Duplicate Numbers</a></li>
73
<li><a>Find all Duplicate Numbers</a></li>
74
<li><a>Find the First K Missing Positive Numbers</a></li>
74
<li><a>Find the First K Missing Positive Numbers</a></li>
75
</ul><h3>In-place Reversal для LinkedList</h3>
75
</ul><h3>In-place Reversal для LinkedList</h3>
76
<p><strong>Техника:</strong>Эта техника описывает эффективный способ перевернуть связи между узлами в LinkedList (класс Java). Часто мы ограничены<em>in-place</em>, то есть мы должны использовать исходные узлы.</p>
76
<p><strong>Техника:</strong>Эта техника описывает эффективный способ перевернуть связи между узлами в LinkedList (класс Java). Часто мы ограничены<em>in-place</em>, то есть мы должны использовать исходные узлы.</p>
77
<p><strong>Задачи для этого паттерна:</strong></p>
77
<p><strong>Задачи для этого паттерна:</strong></p>
78
<ul><li><a>Reverse every K-element Sub-list</a></li>
78
<ul><li><a>Reverse every K-element Sub-list</a></li>
79
<li><a>Rotate a LinkedList</a></li>
79
<li><a>Rotate a LinkedList</a></li>
80
</ul><h3>Поиск в ширину</h3>
80
</ul><h3>Поиск в ширину</h3>
81
<p><strong>Контекст:</strong>Это метод для решения задач с деревьями.</p>
81
<p><strong>Контекст:</strong>Это метод для решения задач с деревьями.</p>
82
<p><strong>Задачи для этого паттерна:</strong></p>
82
<p><strong>Задачи для этого паттерна:</strong></p>
83
<ul><li><a>Binary Tree Level Order Traversal</a></li>
83
<ul><li><a>Binary Tree Level Order Traversal</a></li>
84
<li><a>Minimum Depth of a Binary Tree</a></li>
84
<li><a>Minimum Depth of a Binary Tree</a></li>
85
<li><a>Connect Level Order Siblings</a></li>
85
<li><a>Connect Level Order Siblings</a></li>
86
</ul><h3>Поиск в глубину</h3>
86
</ul><h3>Поиск в глубину</h3>
87
<p><strong>Контекст:</strong>Тот же, что для предыдущего метода.</p>
87
<p><strong>Контекст:</strong>Тот же, что для предыдущего метода.</p>
88
<p><strong>Задачи для этого паттерна:</strong></p>
88
<p><strong>Задачи для этого паттерна:</strong></p>
89
<ul><li><a>Path With Given Sequence</a></li>
89
<ul><li><a>Path With Given Sequence</a></li>
90
<li><a>Count Paths for a Sum</a></li>
90
<li><a>Count Paths for a Sum</a></li>
91
</ul><h3>Двоичная куча</h3>
91
</ul><h3>Двоичная куча</h3>
92
<p><strong>Контекст:</strong>Во многих задачах у нас есть набор элементов, который можно разделить на две части. Тогда мы могли бы выяснить, какой элемент является наименьшим в первой куче и какой является наибольшим во второй куче.</p>
92
<p><strong>Контекст:</strong>Во многих задачах у нас есть набор элементов, который можно разделить на две части. Тогда мы могли бы выяснить, какой элемент является наименьшим в первой куче и какой является наибольшим во второй куче.</p>
93
<p><strong>Задачи для этого паттерна:</strong></p>
93
<p><strong>Задачи для этого паттерна:</strong></p>
94
<ul><li><a>Find the Median of a Number Stream</a></li>
94
<ul><li><a>Find the Median of a Number Stream</a></li>
95
<li><a>Next Interval</a></li>
95
<li><a>Next Interval</a></li>
96
</ul><h3>Подмножества</h3>
96
</ul><h3>Подмножества</h3>
97
<p><strong>Контекст:</strong>Если задача требует перестановки или комбинаций элементов, используйте подмножества.</p>
97
<p><strong>Контекст:</strong>Если задача требует перестановки или комбинаций элементов, используйте подмножества.</p>
98
<p><strong>Задачи для этого паттерна:</strong></p>
98
<p><strong>Задачи для этого паттерна:</strong></p>
99
<ul><li><a>String Permutations by changing case</a></li>
99
<ul><li><a>String Permutations by changing case</a></li>
100
<li><a>Unique Generalized Abbreviations</a></li>
100
<li><a>Unique Generalized Abbreviations</a></li>
101
</ul><h3>Усовершенствованный бинарный поиск</h3>
101
</ul><h3>Усовершенствованный бинарный поиск</h3>
102
<p><strong>Контекст:</strong>Эта техника использует логический оператор для наиболее эффективного поиска элементов.</p>
102
<p><strong>Контекст:</strong>Эта техника использует логический оператор для наиболее эффективного поиска элементов.</p>
103
<p><strong>Задачи для этого паттерна:</strong></p>
103
<p><strong>Задачи для этого паттерна:</strong></p>
104
<ul><li><a>Two Single Numbers</a></li>
104
<ul><li><a>Two Single Numbers</a></li>
105
<li><a>Flip and Invert an Image</a></li>
105
<li><a>Flip and Invert an Image</a></li>
106
</ul><h3>Наибольшее<em>K</em>элементов</h3>
106
</ul><h3>Наибольшее<em>K</em>элементов</h3>
107
<p><strong>Контекст:</strong>Эта техника используется, чтобы найти наибольший/наименьший или наиболее часто встречающийся набор k-элементов в коллекции.</p>
107
<p><strong>Контекст:</strong>Эта техника используется, чтобы найти наибольший/наименьший или наиболее часто встречающийся набор k-элементов в коллекции.</p>
108
<p><strong>Задачи для этого паттерна:</strong></p>
108
<p><strong>Задачи для этого паттерна:</strong></p>
109
<ul><li><a>'K' Closest Points to the Origin</a></li>
109
<ul><li><a>'K' Closest Points to the Origin</a></li>
110
<li><a>Maximum Distinct Elements</a></li>
110
<li><a>Maximum Distinct Elements</a></li>
111
</ul><h3>K-образное слияние</h3>
111
</ul><h3>K-образное слияние</h3>
112
<p><strong>Контекст:</strong>Используйте эту технику, если у вас есть список отсортированных массивов.</p>
112
<p><strong>Контекст:</strong>Используйте эту технику, если у вас есть список отсортированных массивов.</p>
113
<p><strong>Задачи для этого паттерна:</strong></p>
113
<p><strong>Задачи для этого паттерна:</strong></p>
114
<ul><li><a>Kth Smallest Number in M Sorted Lists</a></li>
114
<ul><li><a>Kth Smallest Number in M Sorted Lists</a></li>
115
<li><a>Kth Smallest Number in a Sorted Matrix</a></li>
115
<li><a>Kth Smallest Number in a Sorted Matrix</a></li>
116
</ul><h3>Рюкзак 0-1</h3>
116
</ul><h3>Рюкзак 0-1</h3>
117
<p><strong>Контекст:</strong>Этот паттерн используют для задач на оптимизацию. Используйте эту технику, чтобы выбирать элементы, которые дают максимум выгоды в данном наборе ограничений по вместимости. Учитывая то, что каждый элемент может быть выбран лишь единожды.</p>
117
<p><strong>Контекст:</strong>Этот паттерн используют для задач на оптимизацию. Используйте эту технику, чтобы выбирать элементы, которые дают максимум выгоды в данном наборе ограничений по вместимости. Учитывая то, что каждый элемент может быть выбран лишь единожды.</p>
118
<p><strong>Задачи для этого паттерна:</strong></p>
118
<p><strong>Задачи для этого паттерна:</strong></p>
119
<ul><li><a>Equal Subset Sum Partition</a></li>
119
<ul><li><a>Equal Subset Sum Partition</a></li>
120
<li><a>Minimum Subset Sum Difference</a></li>
120
<li><a>Minimum Subset Sum Difference</a></li>
121
</ul><h3>Неограниченный рюкзак</h3>
121
</ul><h3>Неограниченный рюкзак</h3>
122
<p><strong>Контекст:</strong>То же самое, что в предыдущем паттерне, но только каждый элемент может быть выбран повторно сколько угодно раз.</p>
122
<p><strong>Контекст:</strong>То же самое, что в предыдущем паттерне, но только каждый элемент может быть выбран повторно сколько угодно раз.</p>
123
<p><strong>Задачи для этого паттерна:</strong></p>
123
<p><strong>Задачи для этого паттерна:</strong></p>
124
<ul><li><a>Rod Cutting</a></li>
124
<ul><li><a>Rod Cutting</a></li>
125
<li><a>Coin Change</a></li>
125
<li><a>Coin Change</a></li>
126
</ul><h3>Числа Фибоначчи</h3>
126
</ul><h3>Числа Фибоначчи</h3>
127
<p><strong>Контекст:</strong>Как очевидно из названия, это паттерн для чисел Фибоначчи. Это последовательность, в которой каждое последующее число равно сумме двух предыдущих чисел.</p>
127
<p><strong>Контекст:</strong>Как очевидно из названия, это паттерн для чисел Фибоначчи. Это последовательность, в которой каждое последующее число равно сумме двух предыдущих чисел.</p>
128
<p><strong>Задачи для этого паттерна:</strong></p>
128
<p><strong>Задачи для этого паттерна:</strong></p>
129
<ul><li><a>Staircase</a></li>
129
<ul><li><a>Staircase</a></li>
130
<li><a>House Thief</a></li>
130
<li><a>House Thief</a></li>
131
</ul><h3>Наибольшая последовательность - палиндром</h3>
131
</ul><h3>Наибольшая последовательность - палиндром</h3>
132
<p><strong>Контекст:</strong>Имеется в виду задача, которая может быть использована как для последовательности, так и для<a>строк</a>. По сути это задача на оптимизацию.</p>
132
<p><strong>Контекст:</strong>Имеется в виду задача, которая может быть использована как для последовательности, так и для<a>строк</a>. По сути это задача на оптимизацию.</p>
133
<p><strong>Задачи для этого паттерна:</strong></p>
133
<p><strong>Задачи для этого паттерна:</strong></p>
134
<ul><li><a>Longest Palindromic Subsequence</a></li>
134
<ul><li><a>Longest Palindromic Subsequence</a></li>
135
<li><a>Minimum Deletions in a String to make it a Palindrome</a></li>
135
<li><a>Minimum Deletions in a String to make it a Palindrome</a></li>
136
</ul><h3>Наибольшая общая подстрока</h3>
136
</ul><h3>Наибольшая общая подстрока</h3>
137
<p><strong>Контекст:</strong>Как понятно из названия, это паттерн для работы со строками или другими последовательностями, а также для работы с наборами строк или последовательностей.</p>
137
<p><strong>Контекст:</strong>Как понятно из названия, это паттерн для работы со строками или другими последовательностями, а также для работы с наборами строк или последовательностей.</p>
138
<p><strong>Задачи для этого паттерна:</strong></p>
138
<p><strong>Задачи для этого паттерна:</strong></p>
139
<ul><li><a>Maximum Sum Increasing Subsequence</a></li>
139
<ul><li><a>Maximum Sum Increasing Subsequence</a></li>
140
<li><a>Edit Distance</a></li>
140
<li><a>Edit Distance</a></li>
141
</ul><h3>Чтение префиксного дерева</h3>
141
</ul><h3>Чтение префиксного дерева</h3>
142
<p><strong>Контекст:</strong>Это специфичная для структуры данных техника, с помощью которой читают или создают префиксное дерево.</p>
142
<p><strong>Контекст:</strong>Это специфичная для структуры данных техника, с помощью которой читают или создают префиксное дерево.</p>
143
<p><strong>Задачи для этого паттерна:</strong></p>
143
<p><strong>Задачи для этого паттерна:</strong></p>
144
<ul><li><a>Longest Word in Dictionary</a></li>
144
<ul><li><a>Longest Word in Dictionary</a></li>
145
<li><a>Palindrome Pairs</a></li>
145
<li><a>Palindrome Pairs</a></li>
146
</ul><h3>Острова в матрице</h3>
146
</ul><h3>Острова в матрице</h3>
147
<p><strong>Контекст:</strong>Этот паттерн подходит для чтения любого двумерного массива, где нам нужно обнаружить связанные между собой элементы.</p>
147
<p><strong>Контекст:</strong>Этот паттерн подходит для чтения любого двумерного массива, где нам нужно обнаружить связанные между собой элементы.</p>
148
<p><strong>Задачи для этого паттерна:</strong></p>
148
<p><strong>Задачи для этого паттерна:</strong></p>
149
<ul><li><a>Number of Distinct Islands</a></li>
149
<ul><li><a>Number of Distinct Islands</a></li>
150
<li><a>Maximum Area of Island</a></li>
150
<li><a>Maximum Area of Island</a></li>
151
</ul><h3>Путь проб и ошибок</h3>
151
</ul><h3>Путь проб и ошибок</h3>
152
<p><strong>Контекст:</strong>Этот паттерн подойдет для того, чтобы пройтись по массиву в поисках подходящего под требования элемента.</p>
152
<p><strong>Контекст:</strong>Этот паттерн подойдет для того, чтобы пройтись по массиву в поисках подходящего под требования элемента.</p>
153
<p><strong>Задачи для этого паттерна:</strong></p>
153
<p><strong>Задачи для этого паттерна:</strong></p>
154
<ul><li><a>Find Kth Smallest Pair Distance</a></li>
154
<ul><li><a>Find Kth Smallest Pair Distance</a></li>
155
<li><a>Minimize Max Distance to Gas Station</a></li>
155
<li><a>Minimize Max Distance to Gas Station</a></li>
156
</ul><h3>Система непересекающихся множеств</h3>
156
</ul><h3>Система непересекающихся множеств</h3>
157
<p><strong>Контекст:</strong>Если данные раскиданы по непересекающимся множествам, то они решаются одним и тем же способом.</p>
157
<p><strong>Контекст:</strong>Если данные раскиданы по непересекающимся множествам, то они решаются одним и тем же способом.</p>
158
<p><strong>Задачи для этого паттерна:</strong></p>
158
<p><strong>Задачи для этого паттерна:</strong></p>
159
<ul><li><a>Number of Provinces</a></li>
159
<ul><li><a>Number of Provinces</a></li>
160
<li><a>Bipartite Graph</a></li>
160
<li><a>Bipartite Graph</a></li>
161
</ul><h3>Поиск уникального маршрута</h3>
161
</ul><h3>Поиск уникального маршрута</h3>
162
<p><strong>Контекст:</strong>Этот паттерн подойдет для прохождения по любому многомерному массиву.</p>
162
<p><strong>Контекст:</strong>Этот паттерн подойдет для прохождения по любому многомерному массиву.</p>
163
<p><strong>Задачи для этого паттерна:</strong></p>
163
<p><strong>Задачи для этого паттерна:</strong></p>
164
<ul><li><a>Find Unique Paths</a></li>
164
<ul><li><a>Find Unique Paths</a></li>
165
<li><a>Dungeon Game</a></li>
165
<li><a>Dungeon Game</a></li>
166
</ul>
166
</ul>