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

Решение: минимальные операции, чтобы сделать массив равным

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

Решения LeetCode (161 часть серии)

Это является частью серии объяснений решения LeetCode ( index ). Если вам понравилось это решение или нашел его полезным, Пожалуйста, как Этот пост и/или УПОТАТЬ Мое решение пост на форумах LeetCode Отказ

Проблема лецкода # 1551 (средний): минимальные операции, чтобы сделать массив равным

Описание:

( Перейти к : Идея решения Код : JavaScript | Python |. Java |. C ++

У вас есть массив Arr длины n где ARR [I] = (2 * I) + 1 Для всех допустимых значений Я (то есть 0 ).

В одной операции вы можете выбрать два индекса x и у где 0, y и вычесть 1 от arr [x] и добавить 1 к arr [y] (то есть выполнять arr [x] и ARR [Y] ). Цель состоит в том, чтобы сделать все элементы массива равный . Это гарантировано То, что все элементы массива могут быть равны с использованием некоторых операций.

Учитывая целое число n длина массива. Вернуть Минимальное количество операций необходимо сделать все элементы ARR равных.

Примеры:

Вход:
Выход: 2
Объяснение: ART = [1, 3, 5] Первая операция Выберите и, это приводит к [2, 3, 4] Во второй операции выберите и снова, таким образом, ART = [3, 3, 3].
Вход:
Выход: 9

Ограничения:

  • 1^4

Идея:

( Перейти к : Описание проблемы Код : JavaScript | Python |. Java |. C ++

Эта проблема имеет очень простое математическое решение.

Очевидная вещь вот что массив, образованный инструкцией, является линейная прогресса . Математически, также должно быть очевидно, что ценность которого нам нужно сделать каждый элемент нашего массива, – это то же значение, найденное в середине массива.

Если бы мы должны были следовать буквальным инструкциям, мы могли бы двигаться наружу от средней точки и неоднократно смещать 1 из правой (более высокой) стороны на левую (нижнюю) сторону. Этот процесс приведет к треугольный номер операций, измененные тем, что каждое значение начинается от 2 меньше/больше, чем те, что по обе стороны, а не 1 Отказ

Возьмите, например, случай n или [1,3,7,9,11,13] Отказ Мы будем выполнять операцию дважды на 5 & 9 Пара, четыре раза на 3 & 11 пара, и шесть раз на 1 & 13 Пара, принося все значения для медиана 7 С общей суммой 12 Операции.

Сумма линейно растущих чисел является очень определение треугольного номера, которое в этом случае удваивается, потому что числа являются 2 отдельно, а не 1 Отказ Стандартная формула для треугольного номера является n * (n + 1)/2 Отказ Поскольку наше треугольное число только половина длины массива, не считая среднего, что приравнивает к 2 * ((n – 1)/2) * ((n – 1)/2 + 1)/2 , что упрощает (N ^ 2 – 1)/4 Отказ

Но это когда n нечетно, и середина удобно. Что если n даже?

Если n Даже, то он становится немного другой формулой, с средней точкой на полпути между двумя средневыми точками ( , которая кстати, почему проблема указала ** 2 * разность значения в каждом элементе массива, чтобы предотвратить невозможные фракции * ). В этом случае мы делаем тот же процесс, только на (n – 2)/2 элементы, а не (n – 1)/2 Элементы, пропуская две «средние» элементы.

Это оставит всю левую сторону массива, равного левомедному элементу, и всей правой стороны массива, равной правой среднему элементу. Для того, чтобы даже весь массив нам просто понадобится другой N/2 Операции для перемещения правой стороны вниз 1 и левая сторона вверх 1 Отказ

Эта формула становится 2 * ((n – 2)/2) * ((n – 2)/2 + 1)/2 + n/2 , что приятно упрощает до N ^ 2/4.

Таким образом, единственная разница между двумя формулами является – 1 присутствует в странной версии, которая в основном ошибка округления, если n это странные и может быть исправлено пол результат.

На более интуитивно понятном примечании , если вы думаете о массиве в качестве точек, образующих строку на графике, то вы можете думать об этой строке как диагональ коробки области n * 2n или 2n ^ 2 Отказ Если вы тогда думаете о треугольнике движений, которые должны быть сделаны, вы можете отметить, что область указанного треугольника 1/8 площадь коробки или 2n ^ 2/8 или n ^ 2/4

Реализация:

Оператор отдела пола Python на самом деле может позаботиться о разнице для нас, как может ли естественное литье возвращаемого значения в Java и C ++, но все четыре языка могут просто использовать битона смена к тому же эффекту.

Код JavaScript:

( Перейти к : Описание проблемы Идея решения

var minOperations = function(n) {
    return n * n >> 2
};

Код Python:

( Перейти к : Описание проблемы Идея решения

class Solution:
    def minOperations(self, n: int) -> int:
        return n * n >> 2

Java код:

( Перейти к : Описание проблемы Идея решения

class Solution {
    public int minOperations(int n) {
        return n * n >> 2;
    }
}

C ++ код:

( Перейти к : Описание проблемы Идея решения

class Solution {
public:
    int minOperations(int n) {
        return n * n >> 2;
    }
};

Решения LeetCode (161 часть серии)

Оригинал: “https://dev.to/seanpgallivan/solution-minimum-operations-to-make-array-equal-4f2e”