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

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

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

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

⚡️ Идея
реализуем бинарный поиск, в котором для перемещения указателей будем использовать на длину массива (n)

вычисляем mid, а затем сравниваем текущее значение цитирований с оставшимся количеством статей (n - mid) :
если цитирований больше — передвигаем правый указатель, пробуя увеличить индекс Хирша
если цитирований меньше — передвигаем левый указатель, рассматривая варианты справа

в конце возвращаем количество статей после левого указателя (n - l)

#solution275
Please open Telegram to view this post
VIEW IN TELEGRAM
🟡Medium
624. Maximum Distance in Arrays

📝Вам дан список массивов, где каждый отсортирован в порядке возрастания.

Верните максимальное расстояние, как абсолютную разность |a - b|, выбрав два целых числа из двух разных массивов

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

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

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

⚡️ Идея
в начале проинициализируем минимум и максимум, используя нулевой массив из списка

далее проходим по всему списку массивов, начиная с первого, и на каждом шаге делаем следующее:
считаем текущий результат, используя максимальный и минимальный элемент из массива — |a[0] - max| и |a[last] - min|
обновляем текущий минимум и максимум

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

#solution624
Please open Telegram to view this post
VIEW IN TELEGRAM
🟡Medium
280. Wiggle Sort

📝Дан массив целых чисел nums, отсортируйте его так, чтобы nums[0] <= nums[1] >= nums[2] <= nums[3]....

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

💡: используйте свойство четной и нечетной позиций относительно левого элемента

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

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

⚡️ Идея
🟦заметим, что на выходе значения на нечетных позициях должны быть всегда больше значений слева, а на четных позициях меньше

🟦используем этот факт и, проходя по массиву, меняем местами текущий и элемент слева, если:
позиция нечетная и текущий элемент меньше левого
позиция четная и текущий элемент больше левого

🟦такая замена не портит общую сортировку, так как мы только улучшаем позицию слева и выставляем правильное отношение в текущей

#solution280
Please open Telegram to view this post
VIEW IN TELEGRAM
🟢Easy
350. Intersection of Two Arrays II

📝 Даны два целочисленных массива nums1 и nums2, вернуть массив их пересечение.

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

💡: используйте HashMap для массива меньшей длины

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

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

⚡️ Идея
🟦в начале выбираем меньший по длине массив, рекурсивно вызывая функцию, поменяв местами аргументы, если nums1 > nums2

🟦проходим по первому массиву и в HashMap формируем частоту элементов

🟦проходим по второму массиву и, если в HashMap частота текущего элемента больше нуля, ставим его в nums1[k], а затем увеличиваем k и уменьшаем частоту элемента

🟦в конце с помощью Arrays.copyOfRange(nums1, 0, k) возвращаем массив ответа от 0 до k (не включительно)

#solution350
Please open Telegram to view this post
VIEW IN TELEGRAM
🟡Medium
93. Restore IP Addresses

📝Дана строка, содержащая только цифры, вернуть все допустимые IP-адреса (в любом порядке), которые могут быть сформированы путем вставки точек.

Допустимый IP-адрес состоит ровно из четырех целых чисел, разделенных точками. Каждое целое число находится в диапазоне [0, 255] и не имеет ведущих нулей

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

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

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

⚡️ Идея
реализуем функцию backtrack для рассмотрения всех вариантов постановки точек

поскольку допустимый IP-адрес состоит из чисел в диапазоне [0, 255], можно рассматривать только три варианта постановки точки: после 1-ой, 2-ой и 3-ей цифры от текущей

поэтому для текущей позиции запускаем цикл на 3 вперед, составляя возможный вариант числа для IP-адреса и, если он подходит под условия, рекурсивно вызываем функцию backtrack, в которую передаем:
текущую позицию + 1
счетчик точек + 1
текущий IP-адрес, добавляя полученное число и точку
список результата

базовым случаем для функции будет являться количество точек, равное 4-м, и полностью пройденная строка, тогда добавляем текущий адрес в результат, убирая лишнюю точку в конце

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