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

Минимальное количество операций для приведения X к нулю | LEETCODE 1658 | Решение за секунды | Со...

Shaan Labs

0:00 / 0:00

Минимальное количество операций для приведения X к нулю | LEETCODE 1658 | Решение за секунды | Со...

1 618 просмотров · 1 день назад
Shaan Labs
1,11 тыс. подписчиков
1 618 просмотров · 1 день назад
Задача "Минимальное количество операций для сведения X к нулю" — это задача среднего уровня сложности на LeetCode, которую задают на Amazon, Google и Meta — самое простое объяснение с использованием HashMap, с лучшей визуализацией и без рекурсии или таблиц динамического программирования. Задача LeetCode: https://leetcode.com/problems/minimum... Решение (Java / Python / C++ / C): https://github.com/Shaanworkspace/YOU... Присоединяйтесь к сообществу: Telegram: https://t.me/opentech_shaanlabs WhatsApp: https://chat.whatsapp.com/CvlyO3ZBBoT... Задача LeetCode 1658 «Минимальные операции для сведения X к нулю» дает вам целочисленный массив nums и целое число x. В одной операции вы удаляете самый левый или самый правый элемент и вычитаете его значение из x. Цель состоит в минимизации операций для сведения x к нулю или возврате минус единицы, если это невозможно. Большинство новичков сразу же атакуют оба конца с помощью рекурсии или динамического программирования и тонут в экспоненциальных состояниях. В этом видео проблема перевернута с ног на голову с помощью лучшей визуализации обратного приема, используемого на собеседованиях в Amazon, Google и Meta. Основная идея проста, как только вы ее поймете. Удаление минимального префикса плюс суффикса с суммой x эквивалентно сохранению самого длинного среднего подмассива с суммой total минус x. Итак, сначала вычислите total сумму. Затем определите target как total минус x. Когда target меньше нуля, верните минус единицу. Когда target равно нулю, верните n. В противном случае найдите самый длинный подмассив с суммой target, и ответ будет n минус эта максимальная длина. Чтобы найти этот самый длинный подмассив за один проход, мы используем префиксную сумму с HashMap, без рекурсии и таблиц динамического программирования. Карта хранит каждую префиксную сумму с ее первым индексом, начиная с нуля с индекса минус один, так что подмассивы с самого начала охватываются. На каждой позиции мы вычисляем требуемое значение как сумму префиксов минус целевое значение. Если требуемое значение существует в карте, подмассив между этим сохраненным индексом и текущим индексом в сумме дает целевое значение, и мы обновляем максимальную длину. Если текущая сумма префиксов новая, мы сохраняем ее вместе с индексом и переходим к следующему шагу. Полный псевдокод на Java разбирается построчно, за ним следует доказательство сложности по времени O(n) и по пространству O(n), а также два крайних случая, которые определяют разницу между минус единицей и n. Код доступен на Java, Python, C++ и C по ссылке на решение выше. 00:00 — Почему удаление с обоих концов всех обманывает 01:30 — Объяснение минимальных операций для сведения X к нулю 03:45 — Сумма минус X меняет всё 06:00 — Самый длинный средний подмассив — это реальная цель 08:15 — Префиксная сумма отслеживает сумму каждого подмассива 11:15 — HashMap находит целевую сумму за O(n) 13:30 — Почему HashMap начинает с нуля при минус единице 15:45 — Пробный запуск доказывает логику максимальной длины 18:00 — Псевдокод Java HashMap построчно 19:30 — Доказательство сложности O(n) по времени и O(n) по пространству 20:15 — Крайние случаи, возвращающие минус единицу Часто задаваемые вопросы Вопрос 1: Зачем преобразовывать задачу минимальных операций для сведения X к нулю в задачу поиска самого длинного подмассива? A1: Управление удалениями с обоих концов означает отслеживание двух движущихся частей одновременно. Средний подмассив представляет собой одно непрерывное окно, поэтому максимизация его длины напрямую минимизирует удаления. Одно окно гораздо проще для понимания и кодирования, чем два конца. Q2: Почему здесь используется HashMap вместо рекурсии или динамического программирования? A2: Рекурсия с мемоизацией на двух указателях приводит к слишком большому количеству состояний и таймауту при больших входных данных. Префиксная сумма плюс HashMap находит каждую сумму-кандидат подмассива за один проход за время O(n), что именно и ожидают интервьюеры в Amazon, Google и Meta. Q3: Почему HashMap начинается с нуля по индексу минус один? A3: Эта запись представляет собой пустой префикс перед началом массива. Без нее допустимый подмассив, начинающийся с индекса ноль, не будет иметь соответствующего требуемого значения в карте, и самая длинная длина будет пропущена. Это та строка, которую большинство реализаций забывают. В4: Какова временная и пространственная сложность этого решения с использованием HashMap? О4: Время выполнения составляет O(n) для одного обхода массива со средним числом операций отображения O(1) на элемент. Пространство составляет O(n) для отображения префиксной суммы в худшем случае. Стек рекурсии и таблица динамического программирования не требуются. В5: Что происходит, когда total равно x или total меньше x? О5: Когда target равно нулю, весь массив должен быть удален, поэтому во...