Java Algorithms
111 subscribers
625 photos
623 links
Добро пожаловать💡

Канал для всех, кто ищет качественные решения и объяснения задач на Java

Roadmap по каналу:
https://t.me/algoroadmap/2
Download Telegram
🟡 Medium
279. Perfect Squares

📝Дано целое число n, вернуть наименьшее количество полных квадратов чисел, сумма которых равна n

💡: используйте динамическое программирование

145/200
#leetcode279 | #medium
Please open Telegram to view this post
VIEW IN TELEGRAM
Решение задачи 279

Time: O(√nn)
Space: O(n)

⚡️ Идея
используем динамическое программирование, перебирая все числа от 1 до n и последовательно вычисляя dp[i]:
изначально для каждого i присваиваем значение n, как максимально возможный случай
далее вложенным циклом перебираем все квадраты j от 1 до i и для каждого выбираем минимальное значение между текущим dp[i] и dp[i - j²] + 1
в результате в dp[n] получаем ответ

#solution279
Please open Telegram to view this post
VIEW IN TELEGRAM
🔴Hard
32. Longest Valid Parentheses

📝 Для данной строки, содержащей только символы '(' и ')', вернуть длину самой длинной допустимой подстроки

💡: используйте стек с индексами открывающих скобок

146/200
#leetcode32 | #hard
Please open Telegram to view this post
VIEW IN TELEGRAM
Решение задачи 32

Time: O(n)
Space: O(n)

⚡️ Идея
Создадим стек, в котором будем хранить индексы открывающих скобок '(' и поместим в него -1 для вычисления валидной подстроки от предыдущего индекса
Далее проходим по строке и если текущий символ:
1⃣'(' — помещаем его индекс в стек
2⃣')' — убираем верхний элемент из стека, а затем проверяем:
если стек после удаления пуст — необходимо добавить в него текущий индекс, чтобы вычислять длину следующих валидных подстрок
если стек не пуст — вычисляем длину валидной подстроки, как разницу между текущим индексом и индексом верхнего элемента, сравнивая ее с текущим результатом

#solution32
Please open Telegram to view this post
VIEW IN TELEGRAM
🟡Medium
356. Line Reflection

📝Дано n точек на двумерной плоскости, верните true, если существует такая прямая, параллельная оси Y, которая симметрично отражает данные точки

💡: найдите наименьшее и наибольшее значение x из всех точек, а затем используйте прямую minX + maxX для проверки отражения всех точек

147/200
#leetcode356 | #medium #premium
Please open Telegram to view this post
VIEW IN TELEGRAM
Решение задачи 356

Time: O(n)
Space: O(n)

⚡️ Идея
первым проходом по точкам ищем минимальное и максимальное значения координаты x, а также складываем все точки в Set для дальнейшей проверки за O(1)
так как для прямой s = (minX + maxX) / 2, любая точка будет отражаться в координату (2*s - x, y), то для проверки будем сразу использовать прямую line = minX + maxX
вторым проходом смотрим, содержатся ли в Set все точки (line - x, y), если нет — сразу возвращаем false

#solution356
Please open Telegram to view this post
VIEW IN TELEGRAM
🟡Medium
658. Find K Closest Elements

📝 Дан отсортированный массив целых чисел и два целых числа K и X, верните K ближайших чисел к X в массиве. Результат также должен быть отсортирован.

Целое число a ближе к x, чем b, если:
|a - x| < |b - x|, или
|a - x| == |b - x|и a < b


💡: используйте бинарный поиск для нахождения левой границы ответа

148/200
#leetcode658 | #medium
Please open Telegram to view this post
VIEW IN TELEGRAM
Решение задачи 658

Time: O(logn + k)
Space: O(1)

⚡️ Идея
для решения найдем левую границу результата, используя бинарный поиск с начальными указателями l = 0 и r = arr.length - k
выполняем бинарный поиск:
если arr[mid] ближе к X, чем arr[mid + k], значит arr[mid + k], а также каждый элемент справа от него не может быть в ответе, следовательно, перемещаем правый указатель
та же самая логика, но в обратном порядке — если arr[mid + k] ближе к X, перемещаем левый указатель.
в конце составляем список из элементов массива длиной k, начиная с индекса l

#solution658
Please open Telegram to view this post
VIEW IN TELEGRAM
🟡Medium
986. Interval List Intersections

📝 Вам даны два отсортированных списка интервалов, верните их пересечение.
Например, пересечение [1, 3] и [2, 4] равно [2, 3]

💡: используйте слияние интервалов

149/200
#leetcode986 | #medium
Please open Telegram to view this post
VIEW IN TELEGRAM
Решение задачи 986

Time: O(n + m)
Space: O(n + m)

⚡️ Идея
проходим по интервалам A и B, используя два указателя
составляем интервал пересечения, выбирая максимальное начало и минимальный конец из двух текущих интервалов A и B
если интервал корректный (начало <= конца), добавляем его в результат
перемещаем указатели:
если конец текущего интервала A меньше конца текущего интервала B — перемещаем указатель на A, так как он не сможет пересекать другие интервалы
иначе — по той же логике передвигаем указатель на B

#solution986
Please open Telegram to view this post
VIEW IN TELEGRAM
🟡Medium
161. One Edit Distance

📝 Даны две строки s и t, вернуть true, если они находятся на расстоянии одного редактирования друг от друга.

Строка s находится на расстоянии одного редактирования от t, если можно:
Вставить ровно один символ в s, чтобы получить t
Удалить ровно один символ из s, чтобы получить t
Заменить ровно один символ s другим символом, чтобы получить t

💡: если текущие символы двух строк не равны — используйте каждую операцию и проверьте оставшуюся часть строк

150/200
#leetcode161 | #medium #premium
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Решение задачи 161

Time: O(n)
Space: O(1)

⚡️ Идея
реализуем функцию helper, которая принимает два указателя на строки и возвращает true, если все символы двух строк от этих указателей равны и строки пройдены полностью
проходим по двум строкам и, если текущие символы не равны, используем все возможные операции, вызывая функцию helper в 3-x вариантах:
1⃣ замена символа — передаем указатели (i + 1, i + 1)
2⃣ вставка — передаем указатели (i, i + 1)
3⃣ удаление — передаем указатели (i + 1, i)
если все символы равны, то helper ни разу не вызовется, тогда нужно проверить, что длины строк отличаются строго на 1

#solution161
Please open Telegram to view this post
VIEW IN TELEGRAM
🟢Easy
680. Valid Palindrome II

📝 Для данной строки s вернуть true, если она может быть палиндромом после удаления из нее не более одного символа

💡: используйте два указателя и после несовпадения символов проверьте два варианта удаления

151/200
#leetcode680 | #easy
Please open Telegram to view this post
VIEW IN TELEGRAM
Решение задачи 680

Time: O(n)
Space: O(1)

⚡️ Идея
реализуем функцию check, которая с помощью двух переданных указателей проходит строку с двух сторон и возвращает true, если от этих указателей строка палиндромная и при этом количество удалений символов не больше 1
проверяем всю строку на палиндромность, вызвав check с указателями (0, s.length() - 1) и count = 0, и при несовпадении символов рекурсивно вызываем функцию, используя два варианта удаления:
1⃣удаляем левый символ, check(l + 1, r, count + 1)
2⃣удаляем правый символ, check(l, r - 1, count + 1)

#solution680
Please open Telegram to view this post
VIEW IN TELEGRAM
🟡Medium
2743. Count Substrings Without Repeating Character

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

💡: используйте подход sliding window

152/200
#leetcode2743 | #medium #premium
Please open Telegram to view this post
VIEW IN TELEGRAM
Решение задачи 2743

Time: O(n)
Space: O(1)

⚡️ Идея
используем подход sliding window, в котором для эффективной проверки уникальных символов применяем массив частот:
добавляем текущий правый символ в окно
если добавили повторяющийся символ, удаляем символы слева, пока дубликат не исчезнет
затем подсчитываем количество подстрок, добавляя к результату размер окна

#solution2743
Please open Telegram to view this post
VIEW IN TELEGRAM
🖼Иллюстрация подхода sliding window к задаче 2743

Пример:
s = "abab"


#figure #slidingwindow
Please open Telegram to view this post
VIEW IN TELEGRAM
🟡Medium
735. Asteroid Collision

📝 Дан массив целых чисел, представляющий движение астероидов в ряд.

Для каждого астероида его абсолютное значение является размером, а знак его направлением (+ вправо, - влево).

Если два астероида встретятся, меньший из них взорвется, если они одинакового размера, то взорвутся оба. Два астероида, движущиеся в одном направлении, никогда не встретятся.

Верните состояние астероидов после всех столкновений

💡: используйте стек

153/200
#leetcode735 | #medium
Please open Telegram to view this post
VIEW IN TELEGRAM
Решение задачи 735

Time: O(n)
Space: O(n)

⚡️ Идея
важно понять, что астероиды столкнуться только если первый летит вправо, а второй влево, то есть предположение, что столкновение происходит, только лишь когда знаки у астероидов разные — неверно
используем стек, в который добавляем элементы следующим образом:
если астероид больше 0 (летит вправо), добавляем его в стек
иначе рассматриваем случай столкновения:
пока стек не пуст и верхний астероид меньше текущего, удаляем его
далее проверяем — если стек пуст или верхний элемент меньше 0, значит можно добавить в стек текущий астероид
также обрабатываем случай равенства астероидов и удаляем верхний астероид, если он положительный и равен текущему по размеру
в конце из стека составляем массив для ответа

#solution735
Please open Telegram to view this post
VIEW IN TELEGRAM
🟡Medium
652. Find Duplicate Subtrees

📝Для заданного двоичного дерева вернуть все корни дублирующихся поддеревьев.

Два дерева являются дубликатами, если они имеют одинаковую структуру с одинаковыми значениями узлов

💡: используйте HashMap, где ключом будет являться строковое представление поддерева

154/200
#leetcode652 | #medium
Please open Telegram to view this post
VIEW IN TELEGRAM
Решение задачи 652

Time: O(n)
Space: O(n)

⚡️ Идея
реализуем функцию helper, которая рекурсивно обходит дерево и собирает корни дублирующихся поддеревьев:
обходим правое и левое поддеревья и получаем их идентификаторы
далее составляем строковый ключ поддерева, который вычисляется как leftId + "," + node.val + "," + rightId и по нему кладем в HashMap идентификатор (id), если такой ключ отсутствует. Для идентификатора используем размер map + 1
затем по id увеличиваем значение в HashMap подсчетов поддеревьев и если оно равно 2, значит мы нашли дубликат и можно добавить его в результат
в конце функции возвращаем идентификатор для рекурсивных вызовов

#solution652
Please open Telegram to view this post
VIEW IN TELEGRAM