Это является частью серии объяснений решения LeetCode ( index ). Если вам понравилось это решение или нашел его полезным, Пожалуйста, как этот пост и/или УПОТАТЬ Мое решение пост на форумах LeetCode Отказ
Проблема лецкодов # 462 (средний): минимальные перемещения к равным элементам массива II
Описание:
( Перейти к : Идея решения Код : JavaScript | Python |. Java |. C ++
Учитывая целочисленный массив Nums
размера n
, вернуть Минимальное количество ходов, необходимых для того, чтобы все элементы массива равны Отказ
В одном шаге вы можете увеличить или уменьшить элемент массива по 1
Отказ
Примеры:
Вход: | nums = [1,2,3] |
Вывод: | 2 |
Объяснение: | Нужны только два хода (помните каждый шаг с шагом или уменьшением одного элемента): [1,2,3] => [2,2,3] => [2,2,2] |
Вход: | nums = [1,10,2,9] |
Вывод: | 16 |
Ограничения:
N.Length
1. Длина ^ 5.
-10 ^ 9 [I] ^ 9
Идея:
( Перейти к : Описание проблемы Код : JavaScript | Python |. Java |. C ++
Эта проблема обманчива в его простоте. В конечном итоге, значение, к которому вы хотите установить каждый элемент равным, является Медиана из сортировки Nums множество. Прийти к этой реализации, мы должны сначала подумать о природе проблемы.
Давайте рассмотрим возможный сценарий, в котором мы решили, что наше целевое значение – х Что бы занять анс Количество шагов для завершения. Что было бы с анс Если мы увеличили х по 1 ? Если мы сделали, каждый элемент, который ниже нового х должен потратить еще один шаг, чтобы встать на х , но каждый элемент, который выше нового х придется потратить один меньше движения, чтобы добраться до х Отказ
Это означает, что х Следует естественным образом двигаться вверх, если больше элементов выше х чем ниже. Это также означает обратное, что х следует двигаться вниз, если есть больше элементов ниже х чем выше. Естественный результат этого в том, что х Оседается на месте, где на обеих сторонах одинаковое количество элементов, которое является средним значением Nums Отказ
Чтобы найти среднюю ценность, мы должны сначала сортировать числа . Если Nums Имеет еще одно количество элементов, любое значение между двумя среднему элементами, включительно, будет работать для расчета ответа, поэтому нам не нужно беспокоиться о том, какие из двух элементов, которые мы используем для нашего решения.
После того, как у нас есть средняя ценность, мы можем просто проиграть через Nums и найти сумму различий каждого числа от среднего значения, которое должно быть нашим ответом.
- Сложность времени: O (n * log n) где N это длина числа , для сортировки числа
- Космическая сложность: O (1)
Выполнение:
Для C ++ мы можем использовать nth_element найти Медиана в O (n) время без необходимости полностью сортировать Nums Отказ
Код JavaScript:
( Перейти к : Описание проблемы Идея решения
var minMoves2 = function(nums) { nums.sort((a,b) => a - b) let ans = 0, median = nums[~~(nums.length / 2)] for (let i = 0; i < nums.length; i++) ans += Math.abs(median - nums[i]) return ans }
Код Python:
( Перейти к : Описание проблемы Идея решения
class Solution: def minMoves2(self, nums: List[int]) -> int: nums.sort() ans, median = 0, nums[len(nums) // 2] for num in nums: ans += abs(median - num) return ans
Java код:
( Перейти к : Описание проблемы Идея решения
class Solution { public int minMoves2(int[] nums) { Arrays.sort(nums); int ans = 0, median = nums[nums.length / 2]; for (int num : nums) ans += Math.abs(median - num); return ans; } }
C ++ код:
( Перейти к : Описание проблемы Идея решения
class Solution { public: int minMoves2(vector& nums) { vector ::iterator mid = nums.begin() + nums.size() / 2; nth_element(nums.begin(), mid, nums.end()); int ans = 0, median = nums[nums.size() / 2]; for (auto num : nums) ans += abs(median - num); return ans; } };
Оригинал: “https://dev.to/seanpgallivan/solution-minimum-moves-to-equal-array-elements-ii-oej”