Рубрики
Без рубрики

Решение: минимальные перемещения к равным элементам массива II

Это является частью серии пояснений решения LeetCode (индекс). Если вам понравилось это решение или Фу … помечены алгоритмами, JavaScript, Java, Python.

Это является частью серии объяснений решения 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”