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

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

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

Примеры:

Input: arr[] = {2, -3, 8, -2, 5}
Output: 88
Explanation:
The required maximum product can be obtained using subarray {8, -2, 5}
Therefore, maximum product = (8 + (-2) + 5) * (8) = 88.

Input: arr[] = {-4, 1, -5, 3, 5}
Output: 40

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

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

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

  • Выполните алгоритм Кадане в соответствии со следующими шагами:
    • Инициализируйте три переменные, скажем, максимальная сумма , currSum , currMax как 0 .
    • Пройдите по заданному массиву arr[] и выполните следующие шаги;
      • Обновите currSum как currSum + arr[i] и currMax как max(currMax, arr[i]) .
      • Обновите значение наибольшей суммы как max(largestSum, currMax * currSum) .
      • Если значение currSum меньше 0 , обновите значение currMax и currSum на 0 .
    • После выполнения вышеуказанных шагов верните значение наибольшей суммы как результирующее максимальное произведение суммы подмассива с его максимальным элементом.
  • Инициализируйте переменную, скажем, maxSum как 0 , которая хранит максимальное произведение суммы подмассива с его максимальным элементом.
  • Выполните обновленный алгоритм Кадане с заданным массивом и сохраните возвращенное значение в maxSum .
  • Теперь обновите каждый элемент массива, умножив каждый элемент на (-1) , и снова выполните обновленный алгоритм Кадане с обновленным массивом, чтобы, если максимальный элемент любого подмассива был отрицательным, эта комбинация должна была учитываться.
  • Обновите значение maxSum до максимального значения maxSum и значения, возвращенного предыдущим шагом.
  • После выполнения вышеуказанных шагов выведите в качестве результата значение maxSum .

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

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