My 60 day LeetCode challenge
День 1: Two Sum (Easy)
-
Формулировка: Дан массив целых чисел
numsи целое числоtarget. Найдите индексы двух чисел, которые в сумме даютtarget. -
Пример:
- Вход:
nums = [2, 7, 11, 15],target = 9 - Выход:
[0, 1](потому чтоnums[0] + nums[1] = 2 + 7 = 9)
- Вход:
-
Идея решения: Используйте хэш-таблицу для хранения чисел и их индексов. Проходите по массиву и проверяйте, есть ли в таблице число
target - nums[i].
День 2: Best Time to Buy and Sell Stock (Easy)
- Формулировка: Дан массив цен на акции. Найдите максимальную прибыль, которую можно получить, купив акцию в один день и продав в другой.
- Пример:
- Вход:
prices = [7, 1, 5, 3, 6, 4] - Выход:
5(купить за 1, продать за 6)
- Вход:
- Идея решения: Используйте два указателя: один для минимальной цены, другой для максимальной прибыли.
День 3: Contains Duplicate (Easy)
- Формулировка: Дан массив целых чисел. Определите, содержит ли массив дубликаты.
- Пример:
- Вход:
nums = [1, 2, 3, 1] - Выход:
true
- Вход:
- Идея решения: Используйте хэш-таблицу для проверки наличия дубликатов.
День 4: Valid Palindrome (Easy)
- Формулировка: Дана строка. Определите, является ли она палиндромом, игнорируя небуквенные символы и регистр.
- Пример:
- Вход:
s = "A man, a plan, a canal: Panama" - Выход:
true
- Вход:
- Идея решения: Используйте два указателя: один с начала строки, другой с конца.
День 5: Maximum Subarray (Easy)
- Формулировка: Дан массив целых чисел. Найдите подмассив с максимальной суммой.
- Пример:
- Вход:
nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4] - Выход:
6(подмассив[4, -1, 2, 1])
- Вход:
- Идея решения: Используйте алгоритм Кадане (Kadane's Algorithm).
День 6: Reverse String (Easy)
- Формулировка: Дана строка. Переверните её на месте.
- Пример:
- Вход:
s = ["h", "e", "l", "l", "o"] - Выход:
["o", "l", "l", "e", "h"]
- Вход:
- Идея решения: Используйте два указателя: один с начала, другой с конца.
День 7: 3Sum (Medium)
- Формулировка: Дан массив целых чисел. Найдите все уникальные тройки чисел, которые в сумме дают 0.
- Пример:
- Вход:
nums = [-1, 0, 1, 2, -1, -4] - Выход:
[[-1, -1, 2], [-1, 0, 1]]
- Вход:
- Идея решения: Отсортируйте массив и используйте два указателя для поиска троек.
День 8: Container With Most Water (Medium)
- Формулировка: Дан массив высот. Найдите два столбца, которые образуют контейнер с наибольшим объемом воды.
- Пример:
- Вход:
height = [1, 8, 6, 2, 5, 4, 8, 3, 7] - Выход:
49
- Вход:
- Идея решения: Используйте два указателя: один с начала, другой с конца.
День 9: Longest Substring Without Repeating Characters (Medium)
- Формулировка: Дана строка. Найдите длину самой длинной подстроки без повторяющихся символов.
- Пример:
- Вход:
s = "abcabcbb" - Выход:
3("abc")
- Вход:
- Идея решения: Используйте sliding window и хэш-таблицу.
День 10: Group Anagrams (Medium)
- Формулировка: Дан массив строк. Сгруппируйте анаграммы вместе.
- Пример:
- Вход:
strs = ["eat", "tea", "tan", "ate", "nat", "bat"] - Выход:
[["bat"], ["nat", "tan"], ["ate", "eat", "tea"]]
- Вход:
- Идея решения: Используйте хэш-таблицу, где ключ — отсортированная строка.
День 11: Sort Colors (Medium)
- Формулировка: Дан массив, содержащий числа 0, 1 и 2. Отсортируйте его на месте.
- Пример:
- Вход:
nums = [2, 0, 2, 1, 1, 0] - Выход:
[0, 0, 1, 1, 2, 2]
- Вход:
- Идея решения: Используйте три указателя (Dutch National Flag Algorithm).
День 12: Product of Array Except Self (Medium)
- Формулировка: Дан массив целых чисел. Верните массив, где каждый элемент равен произведению всех элементов исходного массива, кроме текущего.
- Пример:
- Вход:
nums = [1, 2, 3, 4] - Выход:
[24, 12, 8, 6]
- Вход:
- Идея решения: Используйте префиксные и суффиксные произведения.
День 13: Find All Anagrams in a String (Medium)
- Формулировка: Даны две строки
sиp. Найдите все начальные индексы подстрок вs, которые являются анаграммамиp. - Пример:
- Вход:
s = "cbaebabacd",p = "abc" - Выход:
[0, 6]
- Вход:
- Идея решения: Используйте sliding window и хэш-таблицу для подсчета символов.
День 14: Trapping Rain Water (Hard)
- Формулировка: Дан массив высот. Найдите, сколько воды может быть захвачено между столбцами.
- Пример:
- Вход:
height = [0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1] - Выход:
6
- Вход:
- Идея решения: Используйте два указателя или динамическое программирование.
День 15: Reverse Linked List (Easy)
- Формулировка: Разверните односвязный список.
- Пример:
- Вход:
1 -> 2 -> 3 -> 4 -> 5 - Выход:
5 -> 4 -> 3 -> 2 -> 1
- Вход:
- Идея решения: Используйте три указателя: предыдущий, текущий и следующий.
День 16: Merge Two Sorted Lists (Easy)
- Формулировка: Объедините два отсортированных связных списка в один.
- Пример:
- Вход:
1 -> 2 -> 4,1 -> 3 -> 4 - Выход:
1 -> 1 -> 2 -> 3 -> 4 -> 4
- Вход:
- Идея решения: Используйте два указателя для объединения списков.
День 17: Linked List Cycle (Easy)
- Формулировка: Определите, содержит ли связный список цикл.
- Пример:
- Вход:
1 -> 2 -> 3 -> 4 -> 2(цикл) - Выход:
true
- Вход:
- Идея решения: Используйте алгоритм "черепахи и зайца" (Floyd's Cycle Detection).
День 18: Add Two Numbers (Medium)
- Описание: Даны два непустых односвязных списка, представляющих два числа. Нужно вернуть список, представляющий их сумму.
- Пример:
- Вход:
2 -> 4 -> 3,5 -> 6 -> 4 - Выход:
7 -> 0 -> 8(342 + 465 = 807)
- Вход:
- Ключевые моменты:
- Используйте сложение с переносом.
День 19: Remove Nth Node From End of List (Medium)
- Описание: Дан односвязный список и число
n. Нужно удалитьn-й элемент с конца списка. - Пример:
- Вход:
1 -> 2 -> 3 -> 4 -> 5,n = 2 - Выход:
1 -> 2 -> 3 -> 5
- Вход:
- Ключевые моменты:
- Используйте два указателя: один на
nшагов впереди.
- Используйте два указателя: один на
День 20: Merge k Sorted Lists (Hard)
- Описание: Дан массив из
kотсортированных односвязных списков. Нужно объединить их в один отсортированный список. - Пример:
- Вход:
[1 -> 4 -> 5, 1 -> 3 -> 4, 2 -> 6] - Выход:
1 -> 1 -> 2 -> 3 -> 4 -> 4 -> 5 -> 6
- Вход:
- Ключевые моменты:
- Используйте минимальную кучу (min-heap).
День 21: Median of Two Sorted Arrays (Hard)
- Описание: Даны два отсортированных массива. Нужно найти медиану объединенного массива.
- Пример:
- Вход:
nums1 = [1, 3],nums2 = [2] - Выход:
2.0
- Вход:
- Ключевые моменты:
- Используйте бинарный поиск для эффективного решения.
День 22: Maximum Depth of Binary Tree (Easy)
- Формулировка: Найдите максимальную глубину бинарного дерева.
- Пример:
- Вход: Дерево
[3, 9, 20, null, null, 15, 7] - Выход:
3
- Вход: Дерево
- Идея решения: Используйте рекурсию для обхода дерева.
День 23: Symmetric Tree (Easy)
- Формулировка: Определите, является ли бинарное дерево симметричным.
- Пример:
- Вход: Дерево
[1, 2, 2, 3, 4, 4, 3] - Выход:
true
- Вход: Дерево
- Идея решения: Используйте рекурсию для сравнения левого и правого поддеревьев.
День 24: Validate Binary Search Tree (Medium)
- Описание: Дано бинарное дерево. Нужно проверить, является ли оно валидным бинарным деревом поиска.
- Пример:
- Вход: Дерево
[2, 1, 3] - Выход:
true
- Вход: Дерево
- Ключевые моменты:
- Используйте рекурсию с передачей минимального и максимального значений.
День 25: Binary Tree Level Order Traversal (Medium)
- Описание: Дано бинарное дерево. Нужно вернуть список уровней дерева.
- Пример:
- Вход: Дерево
[3, 9, 20, null, null, 15, 7] - Выход:
[[3], [9, 20], [15, 7]]
- Вход: Дерево
- Ключевые моменты:
- Используйте обход в ширину (BFS) с очередью.
День 26: Construct Binary Tree from Preorder and Inorder Traversal (Medium)
- Описание: Даны два массива: префиксный (preorder) и инфиксный (inorder) обходы бинарного дерева. Нужно восстановить дерево.
- Пример:
- Вход:
preorder = [3, 9, 20, 15, 7],inorder = [9, 3, 15, 20, 7] - Выход: Дерево
[3, 9, 20, null, null, 15, 7]
- Вход:
- Ключевые моменты:
- Используйте рекурсию и хэш-таблицу для индексов.
День 27: Flatten Binary Tree to Linked List (Medium)
- Описание: Дано бинарное дерево. Нужно преобразовать его в односвязный список.
- Пример:
- Вход: Дерево
[1, 2, 5, 3, 4, null, 6] - Выход:
1 -> 2 -> 3 -> 4 -> 5 -> 6
- Вход: Дерево
- Ключевые моменты:
- Используйте модифицированный обход в глубину (DFS).
День 28: Serialize and Deserialize Binary Tree (Hard)
- Описание: Нужно реализовать функции для сериализации и десериализации бинарного дерева.
- Пример:
- Вход: Дерево
[1, 2, 3, null, null, 4, 5] - Выход: Сериализованная строка, например,
"1,2,null,null,3,4,null,null,5,null,null"
- Вход: Дерево
- Ключевые моменты:
- Используйте обход в глубину (DFS) для сериализации и десериализации.
День 29: Number of Islands (Medium)
- Формулировка: Дан двумерный массив. Найдите количество "островов" (групп
1, окруженных0). - Пример:
- Вход:
[ ["1", "1", "0", "0", "0"], ["1", "1", "0", "0", "0"], ["0", "0", "1", "0", "0"], ["0", "0", "0", "1", "1"] ] - Выход:
3
- Вход:
- Идея решения: Используйте DFS или BFS для обхода островов.
День 30: Climbing Stairs (Easy)
- Формулировка: Вы поднимаетесь по лестнице. За один шаг можно подняться на 1 или 2 ступеньки. Сколько существует способов подняться на
nступенек? - Пример:
- Вход:
n = 3 - Выход:
3(1+1+1, 1+2, 2+1)
- Вход:
- Идея решения: Используйте динамическое программирование (DP) или числа Фибоначчи.
День 31: House Robber (Medium)
- Формулировка: Дан массив, где каждый элемент представляет сумму денег в доме. Вор не может грабить два соседних дома. Найдите максимальную сумму, которую можно украсть.
- Пример:
- Вход:
nums = [2, 7, 9, 3, 1] - Выход:
12(2 + 9 + 1)
- Вход:
- Идея решения: Используйте динамическое программирование для выбора оптимального пути.
День 32: Word Break (Medium)
- Формулировка: Дана строка
sи список словwordDict. Определите, можно ли разбить строку на слова из списка. - Пример:
- Вход:
s = "leetcode",wordDict = ["leet", "code"] - Выход:
true
- Вход:
- Идея решения: Используйте динамическое программирование для проверки всех возможных разбиений.
День 33: Combination Sum (Medium)
- Формулировка: Дан массив чисел и целевое число. Найдите все уникальные комбинации чисел, которые в сумме дают целевое число.
- Пример:
- Вход:
candidates = [2, 3, 6, 7],target = 7 - Выход:
[[2, 2, 3], [7]]
- Вход:
- Идея решения: Используйте backtracking для поиска всех комбинаций.
День 34: Permutations (Medium)
- Формулировка: Дан массив чисел. Найдите все возможные перестановки этих чисел.
- Пример:
- Вход:
nums = [1, 2, 3] - Выход:
[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
- Вход:
- Идея решения: Используйте backtracking для генерации всех перестановок.
День 35: Subsets (Medium)
- Формулировка: Дан массив чисел. Найдите все возможные подмножества этих чисел.
- Пример:
- Вход:
nums = [1, 2, 3] - Выход:
[[], [1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]
- Вход:
- Идея решения: Используйте backtracking или битовые маски для генерации подмножеств.
День 36: Course Schedule (Medium)
- Формулировка: Дано количество курсов и список зависимостей (какие курсы нужно пройти перед другими). Определите, можно ли завершить все курсы.
- Пример:
- Вход:
numCourses = 2,prerequisites = [[1, 0]] - Выход:
true(можно пройти курс 0, затем курс 1)
- Вход:
- Идея решения: Используйте топологическую сортировку или DFS для обнаружения циклов.
День 37: Pacific Atlantic Water Flow (Medium)
- Формулировка: Дан двумерный массив высот. Определите, в какие клетки вода может течь как в Тихий, так и в Атлантический океан.
- Пример:
- Вход:
[ [1, 2, 2, 3, 5], [3, 2, 3, 4, 4], [2, 4, 5, 3, 1], [6, 7, 1, 4, 5], [5, 1, 1, 2, 4] ] - Выход:
[[0, 4], [1, 3], [1, 4], [2, 2], [3, 0], [3, 1], [4, 0]]
- Вход:
- Идея решения: Используйте BFS или DFS для обхода от океанов.
День 38: Longest Increasing Subsequence (Medium)
- Формулировка: Дан массив чисел. Найдите длину самой длинной возрастающей подпоследовательности.
- Пример:
- Вход:
nums = [10, 9, 2, 5, 3, 7, 101, 18] - Выход:
4(2, 3, 7, 101)
- Вход:
- Идея решения: Используйте динамическое программирование или бинарный поиск.
День 39: Edit Distance (Hard)
- Формулировка: Даны две строки. Найдите минимальное количество операций (вставка, удаление, замена), чтобы преобразовать одну строку в другую.
- Пример:
- Вход:
word1 = "horse",word2 = "ros" - Выход:
3(заменить 'h' на 'r', удалить 'r', удалить 'e')
- Вход:
- Идея решения: Используйте динамическое программирование для подсчета операций.
День 40: Regular Expression Matching (Hard)
- Формулировка: Даны строка и шаблон. Определите, соответствует ли строка шаблону (с поддержкой
.и*). - Пример:
- Вход:
s = "aab",p = "c*a*b" - Выход:
true
- Вход:
- Идея решения: Используйте динамическое программирование для сопоставления шаблона.
День 41: Word Ladder (Hard)
- Формулировка: Даны два слова и список слов. Найдите длину кратчайшей последовательности преобразований из первого слова во второе, меняя по одной букве за раз.
- Пример:
- Вход:
beginWord = "hit",endWord = "cog",wordList = ["hot", "dot", "dog", "lot", "log", "cog"] - Выход:
5("hit" -> "hot" -> "dot" -> "dog" -> "cog")
- Вход:
- Идея решения: Используйте BFS для поиска кратчайшего пути.
День 42: Sliding Window Maximum (Hard)
- Формулировка: Дан массив чисел и размер окна
k. Найдите максимальное значение в каждом окне. - Пример:
- Вход:
nums = [1, 3, -1, -3, 5, 3, 6, 7],k = 3 - Выход:
[3, 3, 5, 5, 6, 7]
- Вход:
- Идея решения: Используйте deque (двустороннюю очередь) для эффективного поиска максимума.
День 43: Merge Sorted Array (Easy)
- Формулировка: Даны два отсортированных массива
nums1иnums2. Объедините их в один отсортированный массив. - Пример:
- Вход:
nums1 = [1, 2, 3, 0, 0, 0],m = 3,nums2 = [2, 5, 6],n = 3 - Выход:
[1, 2, 2, 3, 5, 6]
- Вход:
- Идея решения: Используйте два указателя, начиная с конца массивов.
День 44: Move Zeroes (Easy)
- Формулировка: Дан массив. Переместите все нули в конец, сохраняя порядок остальных элементов.
- Пример:
- Вход:
nums = [0, 1, 0, 3, 12] - Выход:
[1, 3, 12, 0, 0]
- Вход:
- Идея решения: Используйте два указателя: один для текущего элемента, другой для позиции ненулевого элемента.
День 45: Valid Parentheses (Easy)
- Формулировка: Дана строка, содержащая только символы
(,),{,},[,]. Определите, является ли строка валидной. - Пример:
- Вход:
s = "()[]{}" - Выход:
true
- Вход:
- Идея решения: Используйте стек для проверки соответствия скобок.
День 46: Implement Queue using Stacks (Easy)
- Формулировка: Реализуйте очередь, используя два стека.
- Пример:
- Вход:
push(1),push(2),peek(),pop(),empty() - Выход:
1,1,false
- Вход:
- Идея решения: Используйте два стека для симуляции очереди.
День 47: Kth Largest Element in an Array (Medium)
- Формулировка: Найдите k-й наибольший элемент в массиве.
- Пример:
- Вход:
nums = [3, 2, 1, 5, 6, 4],k = 2 - Выход:
5
- Вход:
- Идея решения: Используйте Quickselect или min-heap.
День 48: Top K Frequent Elements (Medium)
- Формулировка: Дан массив чисел. Найдите k наиболее часто встречающихся элементов.
- Пример:
- Вход:
nums = [1, 1, 1, 2, 2, 3],k = 2 - Выход:
[1, 2]
- Вход:
- Идея решения: Используйте хэш-таблицу для подсчета частот и min-heap для выбора k элементов.
День 49: Find Peak Element (Medium)
- Формулировка: Дан массив. Найдите индекс любого пикового элемента (элемент, который больше своих соседей).
- Пример:
- Вход:
nums = [1, 2, 3, 1] - Выход:
2(элемент 3)
- Вход:
- Идея решения: Используйте бинарный поиск для эффективного поиска пика.
День 50: Search in Rotated Sorted Array (Medium)
- Формулировка: Дан отсортированный массив, который был повернут. Найдите индекс целевого элемента.
- Пример:
- Вход:
nums = [4, 5, 6, 7, 0, 1, 2],target = 0 - Выход:
4
- Вход:
- Идея решения: Используйте модифицированный бинарный поиск.
День 51: Minimum Window Substring (Hard)
- Формулировка: Даны две строки
sиt. Найдите минимальную подстроку вs, которая содержит все символы изt. - Пример:
- Вход:
s = "ADOBECODEBANC",t = "ABC" - Выход:
"BANC"
- Вход:
- Идея решения: Используйте sliding window и хэш-таблицу для подсчета символов.
День 52: Subarray Sum Equals K (Medium)
- Формулировка: Дан массив целых чисел и число
k. Найдите количество подмассивов, сумма которых равнаk. - Пример:
- Вход:
nums = [1, 1, 1],k = 2 - Выход:
2(подмассивы[1, 1]и[1, 1])
- Вход:
- Идея решения: Используйте хэш-таблицу для хранения префиксных сумм.
День 53: Palindromic Substrings (Medium)
- Формулировка: Дана строка. Найдите количество палиндромных подстрок.
- Пример:
- Вход:
s = "abc" - Выход:
3("a", "b", "c")
- Вход:
- Идея решения: Используйте расширение вокруг центра для поиска палиндромов.
День 54: Longest Common Subsequence (Medium)
- Формулировка: Даны две строки. Найдите длину их наибольшей общей подпоследовательности.
- Пример:
- Вход:
text1 = "abcde",text2 = "ace" - Выход:
3("ace")
- Вход:
- Идея решения: Используйте динамическое программирование.
День 55: Maximum Product Subarray (Medium)
- Формулировка: Дан массив целых чисел. Найдите подмассив с максимальным произведением.
- Пример:
- Вход:
nums = [2, 3, -2, 4] - Выход:
6(подмассив[2, 3])
- Вход:
- Идея решения: Используйте динамическое программирование для отслеживания минимального и максимального произведения.
День 56: Coin Change (Medium)
- Формулировка: Даны монеты разных номиналов и сумма. Найдите минимальное количество монет, необходимых для получения суммы.
- Пример:
- Вход:
coins = [1, 2, 5],amount = 11 - Выход:
3(5 + 5 + 1)
- Вход:
- Идея решения: Используйте динамическое программирование.
День 57: Decode Ways (Medium)
- Формулировка: Дана строка из цифр. Определите количество способов декодировать её в буквы (A=1, B=2, ..., Z=26).
- Пример:
- Вход:
s = "12" - Выход:
2("AB" или "L")
- Вход:
- Идея решения: Используйте динамическое программирование.
День 58: Unique Paths (Medium)
- Формулировка: Дана сетка m x n. Найдите количество уникальных путей из左上角 в右下角 (движение только вниз или вправо).
- Пример:
- Вход:
m = 3,n = 7 - Выход:
28
- Вход:
- Идея решения: Используйте динамическое программирование или комбинаторику.
День 59: Jump Game (Medium)
- Формулировка: Дан массив, где каждый элемент указывает максимальную длину прыжка. Определите, можно ли добраться до конца массива.
- Пример:
- Вход:
nums = [2, 3, 1, 1, 4] - Выход:
true
- Вход:
- Идея решения: Используйте жадный алгоритм.
День 60: Task Scheduler (Medium)
- Формулировка: Даны задачи и время охлаждения. Найдите минимальное время для выполнения всех задач.
- Пример:
- Вход:
tasks = ["A", "A", "A", "B", "B", "B"],n = 2 - Выход:
8(A -> B -> idle -> A -> B -> idle -> A -> B)
- Вход:
- Идея решения: Используйте жадный алгоритм и приоритетную очередь.