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

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

Roadmap по каналу:
https://t.me/algoroadmap/2
Download Telegram
🟡 Medium
395. Longest Substring with At Least K Repeating Characters

📰 Для заданной строки S и целого числа K вернуть длину самой длинной подстроки, такой, что частота каждого символа в этой подстроке больше или равна k

Подсказка: подсчитывайте частоту символов, а затем проверяйте подстроки, разделенные на символе, не удовлетворяющем условию

134/200
#medium
#leetcode395
Please open Telegram to view this post
VIEW IN TELEGRAM
Решение задачи 395

Time: O(n^2)
Space: O(n)

💡 Идея
▫️Инициализируем массив частот символов и заполняем его, проходя по строке
▫️Затем снова проходим по строке и, если частота символа меньше k — разделяем строку на две части и вычисляем результат для каждой из них, рекурсивно вызывая исходную функцию
▫️В результате получим ответ, представляющий собой максимальный из разделенных частей строки или всю длину строки, если все символы встречаются хотя бы k раз

#solution395
Please open Telegram to view this post
VIEW IN TELEGRAM
🟡 Medium
334. Increasing Triplet Subsequence

📰 Дан целочисленный массив nums, вернуть true, eсли существует тройка индексов (i, j, k) такая, что i < j < k и nums[i] < nums[j] < nums[k]

Подсказка: используйте жадный подход, постоянно обновляя первый и второй элемент в тройке

135/200
#medium
#leetcode334
Please open Telegram to view this post
VIEW IN TELEGRAM
Решение задачи 334

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

💡 Идея
▫️Инициализируем первый и второй элемент тройки, как "бесконечность"
▫️Проходим по массиву и сравниваем текущий элемент с сохраненными элементами тройки:
- если текущий элемент меньше первого в тройке — обновляем его
- если меньше второго — обновляем его
- иначе мы нашли ответ, так как тройка удовлетворяет условию
▫️Таким образом, мы используем жадный подход, отслеживая два минимальных элемента в тройке и, если находится элемент больше, значит результат получен

#solution334
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🔴 Hard
44. Wildcard Matching

📰 Для входной строки s и шаблона p реализуйте сопоставление, где:
'?' — cоответствует любому отдельному символу;
'*' — соответствует любой последовательности символов (включая пустую последовательность);
Сопоставление должно охватывать всю входную строку (не частично)

Подсказка: запоминая позицию '*', проверяйте два случая: замена ее на пустую и заполненную последовательность

136/200
#hard
#leetcode44
Please open Telegram to view this post
VIEW IN TELEGRAM
Решение задачи 44

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

💡 Идея
Проходя по строке S, возможны 4 ситуации соотнесения с шаблоном P:
1⃣Символы равны или символ шаблона P равен '?' — тогда увеличиваем оба указателя
2⃣Символ шаблона равен '*' — тогда мы сохраняем его позицию и соответствующую позицию match в строке S, а затем увеличиваем позицию шаблона (то есть заменяем '*' на пустую последовательность)
3⃣Символы не равны, но при этом уже встречалась '*' — тогда мы возвращаемся к сохраненным позициям на единицу вперед и увеличиваем позицию match, то есть попадая в этот случай, мы используем '*' в качестве последовательности символов и передвигаем только позицию строки S
4⃣Символы не равны, при этом '*' не было — тогда возвращаем false
После выполнения цикла обрабатываем случай, если в конце шаблона P остались '*', которые можно просто заменить на пустоту
В результате возвращаем true, если оба указателя достигли конца строк

📎Хороший пример, чтобы разобраться с алгоритмом:
s = "abcabczzzde", p = "*abc???de*"


#solution44
Please open Telegram to view this post
VIEW IN TELEGRAM
🟡 Medium
64. Minimum Path Sum

📰 Для заданной матрицы найдите путь из левого верхнего угла в правый нижний с минимальной суммой всех чисел, при этом двигаясь только вниз или вправо

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

137/200
#medium
#leetcode64
Please open Telegram to view this post
VIEW IN TELEGRAM
Решение задачи 64

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

💡 Идея
🟪Начиная с первого столбца, заполняем первую строку, суммируя ячейки слева, так как в них можно прийти только таким способом
🟪Следуя такой же логике, заполняем первый столбец, только теперь суммируем элементы сверху
🟪Далее заполняем минимальными путями остальные ячейки, начиная с [1,1], суммируя с текущей минимальную из левой и верхней
🟪В результате в правой нижней ячейке получаем путь с минимальной суммой

#solution64
Please open Telegram to view this post
VIEW IN TELEGRAM
🟡 Medium
454. 4Sum II

📰 Даны четыре целочисленных массива, все имеют длину n, вернуть количество четверок индексов (i, j, k, l), таких что:
0 <= i, j, k, l < n
nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0

Подсказка: используйте HashMap

138/200
#medium
#leetcode454
Please open Telegram to view this post
VIEW IN TELEGRAM
Решение задачи 454

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

💡 Идея
🟦Составляем HashMap из первых двух массивов, где ключом будет являться сумма отдельных элементов, а значением количество таких сумм
🟦Далее проходимся по оставшимся двум массивам и ищем в HashMap сумму, обратную num3 + num4, чтобы получить на выходе 0, и складываем в результат ее количество
🟦В итоге, в ответ просуммированы все варианты четверок элементов, сумма которых равна 0

#solution454
Please open Telegram to view this post
VIEW IN TELEGRAM
🟡 Medium
189. Rotate Array

📰 Дан целочисленный массив, поверните его вправо на k шагов, где k— неотрицательное число

Попробуйте реализовать решение, используя O(1) памяти

Подсказка: перед перестановкой элементов переверните части массива, разделенные k

139/200
#medium
#leetcode189
Please open Telegram to view this post
VIEW IN TELEGRAM
Решение задачи 189

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

💡 Идея
🟪Предварительно реализуем функцию reverse, которая будет переворачивать часть массива по заданным границам
🟪В начале исключим вариант, что k больше n (длина массива), взяв для него остаток от деления на n
🟪Далее переворачиваем поочередно части массива, разделенные k:
от 0 до n - k - 1, то есть первую часть массива
от n - k до n - 1 — вторую часть массива
🟪Затем переворачиваем весь массив и получаем ответ

#solution189
Please open Telegram to view this post
VIEW IN TELEGRAM
🟡 Medium
209. Minimum Size Subarray Sum

📰 Дан массив положительных целых чисел и положительное целое число target, вернуть минимальную длину подмассива, сумма которого больше или равна target

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

140/200
#medium
#leetcode209
Please open Telegram to view this post
VIEW IN TELEGRAM
Решение задачи 209

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

💡 Идея
🟪Используем подход с использованием скользящего окна, для этого:
Проходим по массиву и считаем текущую сумму
Если она превысила или равна target — сравниваем размер окна с текущим минимальным результатом
Затем передвигаем левый указатель вперед, пока сумма не станет меньше target, вычитая элементы находящиеся под ним
🟪В результате получаем минимальную длину подмассива с суммой большей или равной target

#solution209
Please open Telegram to view this post
VIEW IN TELEGRAM
🟡 Medium
394. Decode String

📰 Дана закодированная строка, вернуть ее декодированную.

Правило кодирования: k[string], где string внутри квадратных скобок повторяется ровно k раз, где k — гарантированно положительное целое число. Входная строка всегда соответствует данному формату.

Подсказка: используйте два стека — для чисел и символов, чтобы обрабатывать варианты вложенностей

141/200
#medium
#leetcode394
Please open Telegram to view this post
VIEW IN TELEGRAM
Решение задачи 394

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

💡 Идея
🟦Проходя по заданной строке, есть 4 варианта обработки символа:
1⃣Цифра — запоминаем ее в переменной n, при этом учитываем вариант, что число k может иметь больше одного знака (n = n * 10 + (c - '0'))
2⃣Буква — добавляем символ в текущую строку
3⃣'[' — кладем в стек текущую строку из символов и число n, а затем обнуляем данные переменные, для того, чтобы учесть варианты вложенностей
4⃣']' — запоминаем текущую строку в переменной temp и из стеков достаем значение числа повторений и сохраненную строку, присваивая её текущей строке, а затем добавляем к ней temp n раз
🟦В результате получаем полностью декодированную строку с учетом всех вложенностей

#solution394
Please open Telegram to view this post
VIEW IN TELEGRAM
🟡 Medium
38. Count and Say

📰 Дано положительное целое число n, вернуть последовательность «подсчитай и скажи».
Последовательность «подсчитай и скажи» представляет собой последовательность цифр, определяемую рекурсивной формулой:
countAndSay(1) — "1"
countAndSay(n) — представляет собой кодирование RLE серий countAndSay(n - 1).
RLE — это метод сжатия строк, который работает путем замены последовательных одинаковых символов на конкатенацию символа и числа, обозначающего количество символов.

Например, чтобы сжать строку "3322251", мы заменяем "33"на "23", "222"на "32", "5"на "15" и "1"на "11". Таким образом, сжатая строка становится "23321511"

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

142/200
#medium
#leetcode38
Please open Telegram to view this post
VIEW IN TELEGRAM
Решение задачи 38

Time: O(2^n)
Space: O(n)

💡 Идея
🟪Рекурсивно доходим до базового случая, получая строку s = "1"
🟪Затем преобразуем каждый вариант строки из стека рекурсии, проходя по ней следующим образом:
увеличиваем счетчик символов
если символ последний в строке или он не равен следующему — добавляем счетчик и данный символ в текущее преобразование строки
🟪Таким образом, с помощью рекурсии мы каждый раз получаем текущий вариант кодирования строки от 1 до n, пока не получим итоговый ответ

#solution38
Please open Telegram to view this post
VIEW IN TELEGRAM
🟡Medium
713. Subarray Product Less Than K

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

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

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

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

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

#solution713
Please open Telegram to view this post
VIEW IN TELEGRAM
🟡Medium
583. Delete Operation for Two Strings

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

💡: найдите длину самой длинной общей подпоследовательности

144/200
#leetcode583 | #medium
Please open Telegram to view this post
VIEW IN TELEGRAM