Стартуем марафон с классической и самой первой задачи на LeetCode
Тем не менее, ее всё ещё спрашивают на собеседованиях, а позже мы разберем усложненную версию этой задачи, которую была на реальном собеседовании в Yandex
Тем не менее, ее всё ещё спрашивают на собеседованиях, а позже мы разберем усложненную версию этой задачи, которую была на реальном собеседовании в Yandex
Задача уровня 🟢 Easy
217. Contains Duplicate
Подсказка:используйте HashSet для решения за O(n)
2/200
#easy
#leetcode217
217. Contains Duplicate
Подсказка:
2/200
#easy
#leetcode217
✅ Решение задачи 1
Time: O(n)
Space: O(n)
📝 Идея
Проходимся по массиву, проверяя за O(1) есть ли в map нужный ключ (taget - nums[i]), при этом пока не найдем нужную пару, сохраняем в map (значение массива - индекс)
#solution1
Time: O(n)
Space: O(n)
📝 Идея
Проходимся по массиву, проверяя за O(1) есть ли в map нужный ключ (taget - nums[i]), при этом пока не найдем нужную пару, сохраняем в map (значение массива - индекс)
#solution1
✅ Решение задачи 217
Time: O(n)
Space: O(n)
📝 Идея
Проходимся по массиву, проверяя за O(1) содержится ли в set данный элемент, при этом сохраняем этот элемент для дальнейших проверок
#solution217
Time: O(n)
Space: O(n)
📝 Идея
Проходимся по массиву, проверяя за O(1) содержится ли в set данный элемент, при этом сохраняем этот элемент для дальнейших проверок
#solution217
Задача уровня 🟢 Easy
242. Valid Anagram
Пример:
Подсказка:строки s и t состоят только из строчных букв, как можно использовать массив решения задачи?
3/200
#easy
#leetcode242
242. Valid Anagram
Пример:
Input: s = "anagram", t = "nagaram"
Output: true
Input: s = "rat", t = "car"
Output: false
Подсказка:
3/200
#easy
#leetcode242
Задача уровня 🟡 Medium
49. Group Anagrams
Пример:
Подсказка:что подойдет в качестве ключа в HashMap?
4/200
#medium
#leetcode49
49. Group Anagrams
Пример:
Input: ["eat","tea","tan","ate","nat","bat"]
Output:
[["bat"], ["nat","tan"], ["ate","eat","tea"]]
Подсказка:
4/200
#medium
#leetcode49
✅ Решение задачи 242
Time: O(n)
Space: O(1)
📝 Идея
Используя код символа строки (с - 'a') получаем значение индекса массива и увеличиваем на единицу для строки S, для строки T уменьшаем на единицу
В итоге если массив весь в нулях - значит количество букв в обоих строках одинаково
#solution242
Time: O(n)
Space: O(1)
📝 Идея
Используя код символа строки (с - 'a') получаем значение индекса массива и увеличиваем на единицу для строки S, для строки T уменьшаем на единицу
В итоге если массив весь в нулях - значит количество букв в обоих строках одинаково
#solution242
✅ Решение задачи 49
Time: O(n*klog(k))
Space: O(n)
📝 Идея
Для решения используем HashMap, в качестве пары ключ-значение используем отсортированную строку и ArrayList
Если раньше не встречалось данное отсортированное слово - просто создаем новый ArrayList, далее все строки складываем к своим ключам
#solution49
Time: O(n*klog(k))
Space: O(n)
📝 Идея
Для решения используем HashMap, в качестве пары ключ-значение используем отсортированную строку и ArrayList
Если раньше не встречалось данное отсортированное слово - просто создаем новый ArrayList, далее все строки складываем к своим ключам
#solution49
🟡 Medium
347. Top K Frequent Elements
Пример:
Подсказка:что если сгруппировать значения по частоте появления?
5/200
#medium
#leetcode347
347. Top K Frequent Elements
Пример:
Input: nums = [1,1,1,2,2,3], k = 2
Output: [1,2]
Подсказка:
5/200
#medium
#leetcode347
🟡 Medium
238. Product of Array Except Self
Пример:
Подсказка:как можно использовать префиксные и суффиксные произведения?
6/200
#medium
#leetcode238
238. Product of Array Except Self
Пример:
Input: nums = [1,2,3,4]
Output: [24,12,8,6]
Подсказка:
6/200
#medium
#leetcode238
✅ Решение задачи 347
Time: O(n)
Space: O(n)
📝 Идея
1. Делаем map, где сохраняем для каждого элемента количество его появлений в массиве
2. Формируем массив частоты появлений элементов, то есть каждый элемент добавляется в список под индексом, соответствующем его частоте появления (от 1 до N)
3. Идем в обратном по массиву порядке считывая все значения для ответа
#solution347
Time: O(n)
Space: O(n)
📝 Идея
1. Делаем map, где сохраняем для каждого элемента количество его появлений в массиве
2. Формируем массив частоты появлений элементов, то есть каждый элемент добавляется в список под индексом, соответствующем его частоте появления (от 1 до N)
3. Идем в обратном по массиву порядке считывая все значения для ответа
#solution347
✅ Решение задачи 238
Time: O(n)
Space: O(1)
📝 Идея
Если посчитать массив префиксных произведений получим:
[1, 2, 6, 24]
Постфиксных:
[24, 24, 12, 4]
Тогда элементы массива res[i] = prefix[i - 1] * suffix[i + 1]
В целях экономии памяти данный алгоритм высчитывает всё в одном массиве, при этом префиксное произведение сдвигается вправо, чтобы при обратном проходе элементы высчитывались на нужном месте
После первого цикла получаем массив res = [1, 1, 2, 6]
После второго res = [24, 12, 8, 6]
#solution238
Time: O(n)
Space: O(1)
📝 Идея
Если посчитать массив префиксных произведений получим:
[1, 2, 6, 24]
Постфиксных:
[24, 24, 12, 4]
Тогда элементы массива res[i] = prefix[i - 1] * suffix[i + 1]
В целях экономии памяти данный алгоритм высчитывает всё в одном массиве, при этом префиксное произведение сдвигается вправо, чтобы при обратном проходе элементы высчитывались на нужном месте
После первого цикла получаем массив res = [1, 1, 2, 6]
После второго res = [24, 12, 8, 6]
#solution238
🟡 Medium
128. Longest Consecutive Sequence
Пример:
Подсказка:что отличает стартовый элемент последовательности?
7/200
#medium
#leetcode128
128. Longest Consecutive Sequence
Пример:
Input: nums = [100,4,200,1,3,2]
Output: 4
Самая длинная последовательность последовательных элементов — [1, 2, 3, 4], ее длина равна 4.
Подсказка:
7/200
#medium
#leetcode128
🟢 Easy
125. Valid Palindrome
Пример:
Подсказка:как можно использовать два указателя?
8/200
#easy
#leetcode125
125. Valid Palindrome
Пример:
Input: s = "A man, a plan, a canal: Panama"
Output: true
"amanaplanacanalpanama" is a palindrome.
Input: s = "race a car"
Output: false
"raceacar" is not a palindrome.
Подсказка:
8/200
#easy
#leetcode125
✅ Решение задачи 128
Time: O(n)
Space: O(n)
📝 Идея
1. Все элементы складываем в set
2. Проходимся по массиву, если элемент является начальным (т.е. элемента на единицу меньше нет) считаем длину последовательности
3. Сравниваем с текущим максимумом
#solution128
Time: O(n)
Space: O(n)
📝 Идея
1. Все элементы складываем в set
2. Проходимся по массиву, если элемент является начальным (т.е. элемента на единицу меньше нет) считаем длину последовательности
3. Сравниваем с текущим максимумом
#solution128
✅ Решение задачи 125
Time: O(n)
Space: O(1)
📝 Идея
Используем метод двух указателей: если элементы слева и справа строки неодинаковые: выводим false
Также по условию пропускаем элементы, которые не являются буквой или цифрой
#solution125
Time: O(n)
Space: O(1)
📝 Идея
Используем метод двух указателей: если элементы слева и справа строки неодинаковые: выводим false
Также по условию пропускаем элементы, которые не являются буквой или цифрой
#solution125
🟡 Medium
167. Two Sum II - Input Array Is Sorted
Пример:
Подсказка:задача на применение two pointers
9/200
#medium
#leetcode167
167. Two Sum II - Input Array Is Sorted
Пример:
Input: numbers = [2,7,11,15], target = 9
Output: [1,2]
Input: numbers = [2,3,4], target = 6
Output: [1,3]
Подсказка:
9/200
#medium
#leetcode167
🟡 Medium
15. 3Sum
Пример:
Подсказка:если зафиксировать одно значение - задача становится похожа на two sum
10/200
#medium
#leetcode15
15. 3Sum
Пример:
Input: nums = [-1,0,1,2,-1,-4]
Output: [[-1,-1,2],[-1,0,1]]
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0.
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0.
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0.
Различными триплетами являются [-1,0,1] и [-1,-1,2].
Подсказка:
10/200
#medium
#leetcode15
✅ Решение задачи 167
Time: O(n)
Space: O(1)
📝 Идея
Используем метод двух указателей: поскольку массив изначально отсортирован - можно однозначно сказать, что если текущая сумму больше target, то остается только уменьшать правую границу, если сумма меньше - увеличиваем левую
Так, пока не найдем нужную пару
#solution167
Time: O(n)
Space: O(1)
📝 Идея
Используем метод двух указателей: поскольку массив изначально отсортирован - можно однозначно сказать, что если текущая сумму больше target, то остается только уменьшать правую границу, если сумма меньше - увеличиваем левую
Так, пока не найдем нужную пару
#solution167
✅ Решение задачи 15
Time: O(n²)
Space: O(1)
📝 Идея
Используем принцип двух указателей, только теперь фиксируем один элемент и проходимся по оставшимся знакомым алгоритмом
Циклы while и блок с continue нужны для того, чтобы не было повторений триплетов
#solution15
Time: O(n²)
Space: O(1)
📝 Идея
Используем принцип двух указателей, только теперь фиксируем один элемент и проходимся по оставшимся знакомым алгоритмом
Циклы while и блок с continue нужны для того, чтобы не было повторений триплетов
#solution15
🟡 Medium
11. Container With Most Water
Пример:
Подсказка:задача на использование two pointers
11/200
#medium
#leetcode11
11. Container With Most Water
Пример:
Input: height = [1,8,6,2,5,4,8,3,7]
Output: 49
Подсказка:
11/200
#medium
#leetcode11