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

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

Roadmap по каналу:
https://t.me/algoroadmap/2
Download Telegram
Решение задачи 583

Time: O(nm)
Space: O(nm)

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

#solution583
Please open Telegram to view this post
VIEW IN 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