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

Опубликовано: 20 Сентября, 2022

Учитывая массив, arr[] размера N. Задача состоит в том, чтобы выполнить минимальное увеличение или уменьшение операций над элементами массива, чтобы сделать все элементы последовательными, вывести минимальную сумму всех возможных изменений (сложение и вычитание) требуется сделать то же самое.

Примеры :

Input: N = 5, arr[] = {13, 6, 11, 18, 4}
Output: 15
Explanation: Convert 4 to 9, 8 to 10, 13 to12 and 18to13, the new array becomes {9, 10, 11, 12, 13}. 
So the sum of changes are abs(9-4) + abs(10-8) + abs(12-13) + abs(13-18) = 15.

Input: N = 2, arr[] = {3, 8}
Output: 4

Подход: Задачу можно решить с помощью наблюдений. Медиана элементов массива должна остаться неизменной , а остальные элементы должны быть соответственно изменены так, чтобы все элементы стали последовательными .
Выполните следующие шаги, чтобы решить проблему:

  • Сортировать массив
  • Возьмите переменную mid , в которой хранится медиана массива, и переменную pos , в которой хранится ее позиция.
  • Кроме того, возьмите переменную ele и инициализируйте ее с помощью в наименьшее значение результирующего массива т.е. (mid – pos) и переменная sum = 0 для хранения суммы всех возможных изменений элементов массива.
  • Итерация по массиву и в каждой i -й итерации:
    • Увеличение суммы с помощью abs(arr[i]-ele) (добавление разницы между исходным и требуемым элементом)
    • Увеличить ele на 1
  • Выведите сумму.

Ниже приведена реализация вышеуказанного подхода:

Временная сложность : O(N * logN)
Вспомогательное пространство : O(1)