Минимизировать сумму абсолютных значений A[i] – (B + i) для данного массива

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

Для заданного массива arr[ ] размера N задача состоит в том, чтобы найти минимально возможное значение выражения abs(arr[1] – (b + 1)) + abs(arr[2] – (b + 2)) . . . abs(arr[N] – (b + N)) , где b — независимое целое число.

Input: arr[ ] = { 2, 2, 3, 5, 5 }
Output: 2
Explanation: Considering b = 0: The value of the expression is abs(2 – (0 + 1)) + abs(2 – (0 + 2)) + abs(3 – (0 + 3)) + abs(5 – (0 + 4)) + abs(5 – (0 + 5)) = 1 + 0 + 0 + 1 + 0 = 2
Therefore, the minimum possible value for the expression is 2.

Input: arr[ ] = { 6, 5, 4, 3, 2, 1 }
Output: 18

Подход: учитывая, что B[i] = A[i] − i, задача состоит в том, чтобы свести к минимуму сумму abs (B[i] − b). Можно заметить, что лучше всего использовать b как медиану модифицированного массива B[]. Итак, после сортировки массива B[] проблему можно решить, выполнив шаги, указанные ниже .

  • Пройдите по массиву arr[ ] и уменьшите каждый элемент по его индексу (i + 1) .
  • Отсортируйте массив в порядке возрастания.
  • Теперь выберите b как медиану arr[ ] , скажем, b = arr[N/2] .
  • Инициализируйте переменную, скажем , как 0, чтобы сохранить минимально возможное значение выражения.
  • Снова пройдитесь по массиву и обновите ans как abs(arr[i] – b).
  • Возвращает значение ans .

Ниже приведена реализация описанного выше подхода.

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