Решения 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”