K-е наименьшее число с комбинацией номиналов | LeetCode 3116 | Сложная задача простыми словами
Shaan Labs
0:00 / 0:00
K-е наименьшее число с комбинацией номиналов | LeetCode 3116 | Сложная задача простыми словами
2 637 просмотров · 6 дней назад
Shaan Labs
454 подписчика
2 637 просмотров · 6 дней назад
Решение задачи "Наименьшее k-е количество с одной номинальной стоимостью" на Java объяснено. Этот пошаговый разбор задачи LeetCode 3116 делает сложную задачу простой: даны номиналы монет и k, каждая монета d порождает только свои кратные d, 2d, 3d, и цель — найти k-е наименьшее количество среди всех этих монет.
Задача LeetCode 3116 имеет рейтинг "Сложный" с вероятностью принятия 26%. Ловушка перебора заключается в генерации всех кратных значений, хранении отсортированного множества и выборе k-го. Это приводит к ошибке, потому что k может достигать 2 × 10 в степени 9, поэтому вам пришлось бы хранить миллиарды значений, что слишком медленно и занимает много памяти.
Подход, позволяющий пройти проверку, задает более умный вопрос: для кандидата X, сколько допустимых сумм меньше или равны X? Этот подсчет монотонен, поэтому мы используем бинарный поиск по X до тех пор, пока count(X) не станет не менее k. Мы вычисляем count(X) с использованием включения-исключения для каждого непустого подмножества монет: добавляем X к каждой отдельной монете, вычитаем X к каждой паре НОК, добавляем обратно каждое тройное НОК, нечетные подмножества складываются, а четные вычитаются. Цикл с битовой маской перечисляет подмножества, НОК определяется из НОД, и мы прерываем поиск, как только НОК превышает X. Бинарный поиск выполняется от 1 до наименьшей монеты, умноженной на k.
Мы запускаем пробный поиск монет 5 и 2 с k = 7, объединяя кратные им значения в 2, 4, 5, 6, 8, 10, 12, 7-й элемент равен 12. Затем мы проходим полный код Java: функцию count с включением-исключением с битовой маской, вспомогательные функции для НОД и НОК, а также бинарный поиск, возвращающий наименьшее X, значение которого не меньше k. Отправка принята.
Разделы (на основе реального контента SRT): 00:00 — Завязка: Только несколько процентов могут решить эту сложную задачу
01:10 — Постановка задачи: Комбинации одной купюры
03:30 — Пример решения: coins [5,2], k=7 дает 12
06:00 — Почему метод грубой силы не работает: k до 2 × 10 в степени 9
08:30 — Ключевой момент: Спросите, сколько сумм меньше или равны X
11:00 — Объяснение функции count(X)
14:30 — Метод включения-исключения с НОК: сложение нечетных, вычитание четных
18:00 — Перечисление подмножеств с помощью битовой маски
21:00 — Бинарный поиск для X: low=1, high=min(coins) × k
24:00 — Разбор кода на Java: count, НОД, НОК, бинарный поиск Поиск
27:30 — Отправка и принятие
Полный код: https://github.com/Shaanworkspace/YOU...
Больше от Shaan Labs: Ежедневные решения LeetCode → https://github.com/Shaanworkspace/YOU... Плейлист LeetCode → [ОТСУТСТВУЕТ: URL плейлиста - пользователь предоставит сам]
Часто задаваемые вопросы:
Что такое LeetCode 3116 K-я наименьшая сумма с одной комбинацией номиналов? LeetCode 3116 предоставляет массив номиналов монет и k. У вас есть неограниченное количество монет каждого типа, но вы не можете смешивать номиналы, поэтому каждая монета d дает только кратные d, 2d, 3d и так далее. Цель - найти k-ю наименьшую различную сумму в объединении всех кратных. Для монет 5 и 2 с k = 7 ответ равен 12.
Почему метод перебора не работает для K-й наименьшей суммы? Метод перебора генерирует все кратные каждой монете значения, хранит их в отсортированном наборе и возвращает k-е значение. Он не работает, потому что k может достигать 2 × 10 в степени 9, поэтому вам пришлось бы генерировать и хранить миллиарды значений, что слишком медленно и слишком много для памяти. Это ограничение вынуждает использовать бинарный поиск плюс подсчет.
Как работает бинарный поиск для K-й наименьшей суммы с одной комбинацией номиналов? Вместо построения последовательности мы выполняем бинарный поиск кандидата X и спрашиваем, сколько допустимых сумм меньше или равны X. Этот подсчет монотонен, поэтому мы устанавливаем значение от 1 до 2, когда значение равно k, и от 1 до 2 плюс единица в противном случае. Поиск выполняется от 1 до наименьшей монеты, умноженной на k, и возвращает наименьшее значение X со значением не менее k.
Что такое принцип включения-исключения в этой задаче? Разные монеты имеют общие кратные значения, поэтому сложение X, деленное на каждую монету, приводит к избыточному подсчету перекрытий. Принцип включения-исключения решает эту проблему: складывается количество каждой отдельной монеты, вычитается количество каждой пары, используя их НОК, затем добавляется количество каждой тройки, используя их НОК, и продолжается дальше. Подмножества нечетных размеров складываются, подмножества четных размеров вычитаются, что дает точный размер объединения.
Почему мы используем НОК и НОД в функции подсчета? Две монеты a и b дают общее кратное значение в каждой точке, кратной их НОК, поэтому для устранения их перекрытия мы вычитаем X, деленное на НОК a и b. НОК вычисляется из НОД как a, умноженное на b, деленное на НОД a и b, что обеспечивает точность и скорость арифметических вычислений.
Какова временная и пространственная сложность решения задачи поиска K-го на...