Минимизируйте максимальный элемент массива, разделив элементы массива на степени двойки не более K раз

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

Дан массив arr[] , состоящий из N положительных целых чисел и целого числа K , задача состоит в том, чтобы минимизировать максимальное значение массива, разбивая элемент массива на степени 2 не более K раз.

Примеры:

Input: arr[] = {2, 4, 11, 2}, K = 2
Output: 2
Explanation:
Below are the operations performed on array elements at most K(= 2) times:
Operation 1: Remove the element at index 2, i.e., arr[2] = 11 and replace it with 11 numbers of 1s in it. Now the array arr[] modifies to {2, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2}.
Operation 2: Remove the element at index 1, i.e., arr[1] = 4 and replace it with 4 numbers of 1s in it. Now the array arr[] modifies to {2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2}.

After performing the above operations, the maximum value of the array is 2, which is minimum possible value.

Input: arr[]= {9}, K = 2
Output: 1

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

  • Отсортируйте массив arr[] по убыванию.
  • Найдите количество нулей в массиве arr[], если значение count равно N , затем выведите 0 как результирующее минимальное максимальное значение массива.
  • В противном случае, если значение K не меньше N , выведите 1 как результирующее минимальное максимальное значение массива.
  • В противном случае выведите значение arr[K] как результирующее минимальное максимальное значение массива.

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

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

Еще один эффективный подход: в предыдущем подходе мы сортировали массив и находили (K+1)-й максимальный элемент для K<N. Вместо сортировки массива мы можем использовать приоритетную очередь , чтобы найти (K+1)-й максимальный элемент.

Временная сложность для этого подхода в худшем случае составляет O(N*log(K)) для k<N, в противном случае временная сложность составляет O(1). Следовательно, данный подход намного лучше предыдущего для меньшего значения k.

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

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