LeetCode 3551: Минимальное количество перестановок для сортировки по сумме цифр | НЕ используйте ...
Code Intuition
0:00 / 0:00
LeetCode 3551: Минимальное количество перестановок для сортировки по сумме цифр | НЕ используйте ...
154 просмотра · 6 дн. назад
Code Intuition
41 подписчик
154 просмотра · 6 дн. назад
LeetCode 3551: Минимальное количество перестановок для сортировки по сумме цифр — оптимальное решение на C++ 🚀
📌 Ссылка на задачу: https://leetcode.com/problems/minimum...
Добро пожаловать обратно в Code Intuition! В сегодняшнем видео мы разберем задачу LeetCode 3551, «Минимальное количество перестановок для сортировки по сумме цифр», с помощью оптимального подхода на C++.
Перестановка соседних чисел по одному, как в сортировке пузырьком, приводит к нерациональному использованию ходов и не дает минимального результата. Решение — идея циклической сортировки. Сначала определите, где должно находиться каждое число, затем переставьте каждое число прямо на место назначения. Каждая перестановка помещает как минимум одно число на его конечное место навсегда, поэтому ни один ход не тратится впустую.
💡 Основная идея:
Найдите целевой порядок: сопоставьте каждое число с суммой его цифр и отсортируйте пары. В C++ сначала сравнивается сумма цифр, а затем само значение, что в точности соответствует условию задачи.
Сопоставьте каждое значение с его «местом»: после сортировки сохраните целевой индекс каждого значения в хеш-таблице. Поскольку все числа различны, каждое значение имеет ровно одно «место».
Циклы: нарисуйте стрелку от каждой позиции к позиции, где находится её число. Стрелки образуют замкнутые петли, называемые циклами, и каждое неправильно расположенное число находится на одной из них.
Переместитесь прямо к месту назначения: если число с индексом i не находится на своём месте, поменяйте его местами с числом в его «месте назначения», затем проверьте новое число, теперь находящееся на индексе i, и повторяйте, пока правильное число не окажется на этом месте.
Минимум: для цикла длиной L требуется ровно L минус 1 перестановок, поэтому ответ равен n минус количество циклов. Каждый обмен фиксирует как минимум одно число навсегда, поэтому общее число никогда не превысит n минус 1.
💡 Что вы узнаете из этого видео:
Почему для минимального количества обменов необходимо циклическое мышление, а не обмен смежными элементами
Как std::pair автоматически предоставляет основное правило сортировки и механизм разрешения конфликтов
Как построить карту целевых индексов с помощью unordered_map
Почему для цикла длиной L требуется ровно L минус 1 обменов
Пошаговое решение на доске с двумя пробными запусками, включая 3-цикловый цикл
Полный анализ временной и пространственной сложности
⏳ Временная сложность: O(N log N) — сортировка пар является доминирующей, а цикл обмена занимает O(N) в общей сложности
💾 Пространственная сложность: O(N) — массив пар и карта индексов содержат N элементов
Решено в рамках моей ежедневной серии задач LeetCode, по одной задаче в день, развивающей интуицию, а не просто запоминающей решение. Полный код на C++ смотрите в закрепленном комментарии.
Не забудьте поставить лайк, подписаться и включить уведомления, чтобы не пропустить ежедневный разбор алгоритмов. Напишите в комментариях, если вы впервые попробовали поменяться соседями!
Свяжитесь со мной:
LinkedIn: / harshwardhanzanwar
📸 Хотите отдохнуть от алгоритмов? Видео и тренды, не имеющие отношения к программированию, — в моем Instagram: https://www.instagram.com/that.harsh....
#leetcode #dsa #codinginterview #greedyalgorithm #cpp #coding #codeintuition #greedy #leetcodechallenge #softwareengineering