Перейти к содержимому

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-го на...