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

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

Roadmap по каналу:
https://t.me/algoroadmap/2
Download Telegram
🟡Medium
2352. Equal Row and Column Pairs

📝Для заданной целочисленной матрицы вернуть количество пар, в которых строка и столбец равны.

Пара строк и столбцов считается равной, если они содержат одни и те же элементы в одном и том же порядке

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

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

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

⚡️ Идея
проходим по строкам матрицы и сохраняем их частоту в HashMap, используя для ключа строковое представление массива Arrays.toString(row)

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

#solution2352
Please open Telegram to view this post
VIEW IN TELEGRAM
🟡Medium
1910. Remove All Occurrences of a Substring

📝Даны две строки — s и part, удаляйте самое левое вхождение подстроки part в s, пока не будут удалены все.

Верните s после всех операций

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

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

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

⚡️ Идея
🟦проходим по строке и кладем текущий символ в стек

🟦если текущий символ равен последнему в строке part и размер стека больше длины part (m):
формируем из стека строку длиной m и, если она не равна part, кладем ее обратно

🟦в конце формируем строку ответа из полученного стека


📎В комментариях решение в 5 строк, но за O(n²)
#solution1910
Please open Telegram to view this post
VIEW IN TELEGRAM
🟡Medium
120. Triangle

📝 Для заданного "cписка-треугольника" вернуть минимальную сумму пути сверху вниз.

Если вы находитесь в позиции i в текущей строке, вы можете перейти либо на такую же, либо на позицию i + 1 в следующей строке

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

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

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

⚡️ Идея
используем массив dp, который изначально представляет собой основание треугольника со всеми его значениями

затем, начиная с предпоследней строки, поднимаемся наверх и для каждого столбца составляем оптимальный путь следования, обновляя dp[j], как сумму текущего значения и минимума из следующей строки (dp[j] и dp[j + 1])

в результате прохода попадаем в вершину треугольника, то есть в нулевом элементе массива dp получаем минимальную сумму

#solution120
Please open Telegram to view this post
VIEW IN TELEGRAM
🟡Medium
1497. Check If Array Pairs Are Divisible by k

📝Дан массив целых чисел четной длины n и целое число k.

Верните true, если можно разделить массив ровно на n / 2 пары так, чтобы сумма каждой делилась на k

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

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

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

⚡️ Идея
составим массив частот freq остатков от деления на k:
проходим по массиву и для каждого числа вычисляем остаток от деления на k, при этом используем запись (num % k + k) % k, чтобы предотварить отрицательные значения

проходим по freq и, поскольку пар необходимо n / 2, то количество остатков i должно быть столько же, сколько и остатков k - i, поэтому возвращаем false, если условие нарушено

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

Для примера 1:
[1 2 3 4 5 10 6 7 8 9] — исходный массив
[1 2 3 4 0 0 1 2 3 4] — остатки от деления на k
[2 2 2 2 2] — массив частот остатков
#solution1497
Please open Telegram to view this post
VIEW IN TELEGRAM
🟢Easy
1427. Perform String Shifts

📝 Вам дана строка s и матрица shift, где shift[i] = [d, c]

d — это направление: 0 для сдвига влево, 1 для сдвига вправо
c — это величина, на которую должна быть смещена строка

Верните окончательную строку после всех операций

💡: посчитайте общий сдвиг, пройдя по всей матрице shift

181/200
#leetcode1427 | #easy #premium
Please open Telegram to view this post
VIEW IN TELEGRAM
Решение задачи 1427

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

⚡️ Идея
проходим по всей матрице shift, чтобы посчитать результирующий сдвиг

затем находим для него остаток от деления на длину строки n для обработки случая, когда сдвиг превышает n

в зависимости от знака total делаем следующее:
если total > 0 — выполняем сдвиг total элементов вправо, вернув строку, как [n - total, n) + [0, n - total)
если total < 0 — выполняем сдвиг total элементов влево, поменяв знак у total и вернув строку, как [-total, n) + [0, -total)
иначе — возвращаем исходную строку

#solution1427
Please open Telegram to view this post
VIEW IN TELEGRAM
🟡Medium
983. Minimum Cost For Tickets

📝Дан массив days, представляющий собой номера дней поездки.

Есть три варианта проездных:
1-дневный продается за costs[0]
7-дневный продается за costs[1]
30-дневный продается за costs[2]

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

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

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

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

⚡️ Идея
🟦инициализируем массив dp размером последнего дня поездки и указатель t=0 на текущий день

🟦далее проходим по dp, начиная с единицы:
если текущее значение меньше текущего дня поездки, значит в этот день ехать не нужно и стоимость будет как в предыдущий день: dp[i] = dp[i - 1]

иначе увеличиваем t и для dp[i] выбираем минимум из 3 вариантов:
покупаем 1-дневный проездной и добавляем его стоимость к значению dp предыдущего дня: dp[i - 1]
покупаем 7-дневный проездной и добавляем его стоимость к значению dp за 7 дней до этого: dp[i - 7]
покупаем 30-дневный проездной и добавляем его стоимость к значению dp за 30 дней до этого: dp[i - 30]

🟦в итоге в dp[lastDay] получаем минимальную стоимость всей поздки

#solution983
Please open Telegram to view this post
VIEW IN TELEGRAM
🟡Medium
767. Reorganize String

📝Дана строка, переставьте ее символы так, чтобы любые два соседних не были одинаковыми.

Верните любую возможную перестановку или верните "", если это невозможно

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

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

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

⚡️ Идея
в начале составляем массив частот символов count и сохраняем самый частый; если его частота больше половины длины строки — возвращаем ""

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

затем проходим по count и заполняем оставшиеся пропуски в массиве ответа другими символами, также перемещая указатель через один

в конце с помощью String.valueOf(res) превращаем массив в строку ответа

Пример алгоритма для строки s = "bfrbs":
после max: b_b__
далее: b_b_f -> brb_f -> brbsf


#solution767
Please open Telegram to view this post
VIEW IN TELEGRAM
1
🟢Easy
1351. Count Negative Numbers in a Sorted Matrix

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

Необходимо решить задачу за O(n + m) по времени

💡: используйте указатель на отрицательные элементы и перемещайте его на каждой строке

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

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

⚡️ Идея
инициализируем указатель ind на последний столбец матрицы

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

используем это и, проходя по строкам матрицы, на каждой:
перемещаем указатель влево, пока под ним находится отрицательный элемент
добавляем к результату количество отрицательных элементов, как (m - 1) - ind

#solution1351
Please open Telegram to view this post
VIEW IN TELEGRAM
🟡Medium
31. Next Permutation

📝Дан массив целых чисел nums, верните его следующую перестановку за O(1) по памяти.

Например, для arr = [1, 2, 3] все перестановки по порядку:
[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]


💡: найдите позицию с конца, где nums[i] < nums[i + 1] и делайте перестановку, используя подмассив справа от неё

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

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

⚡️ Идея
отметим, что для любой последовательности в порядке убывания следующая перестановка невозможна (как для [3, 2, 1])

проходим массив с конца и находим положение, где nums[i] < nums[i + 1], это значит, что для подмассива справа от i перестановка невозможна, так как он находится в порядке убывания

теперь, для создания перестановки необходимо поменять местами nums[i] и следующее минимально большее число после него

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

в результате получаем перестановку, которая следует прямо после исходной

#solution31
Please open Telegram to view this post
VIEW IN TELEGRAM
🟢Easy
859. Buddy Strings

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

💡: найдите 2 индекса, где символы в строках не совпадают

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

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

⚡️ Идея
в начале проверим один из краевых случаев:
строки идентичны — возвращаем true, если в s содержатся повторяющиеся символы, иначе false

строку s можно превратить в goal с помощью одной перестановки, если только два символа в строках отличаются, поэтому инициализируем два указателя, как -1 и проходим по строкам:
нашли 1-е несовпадение — сохраняем позицию в первый указатель
нашли 2-е несовпадение — сохраняем позицию во второй указатель
если различий больше — сразу возвращаем false

далее проверяем, что несовпадений ровно 2 (второй указатель не равен -1) и возвращаем true, если символы в строках s и goal равны по разным указателям, то есть перестановка в s даст goal

#solution859
Please open Telegram to view this post
VIEW IN TELEGRAM
🟡Medium
71. Simplify Path

📝 Вам дан абсолютный путь для файловой системы в стиле Unix, который всегда начинается с косой черты '/'. Преобразуйте этот абсолютный путь в упрощенный.

Правила файловой системы в стиле Unix:

'.' — представляет текущий каталог
'..' — обозначает предыдущий каталог
несколько последовательных слешей (например '//' или '///') рассматриваются, как один слеш '/'
любая последовательность точек, которая не соответствует правилам выше, рассматривается, как допустимое имя каталога

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

💡: используйте стек и разделите исходный путь по "/"

187/200
#leetcode71 | #medium
Please open Telegram to view this post
VIEW IN TELEGRAM