Back to all solutions

#2439 - Minimize Maximum of Array

Problem Description

You are given a 0-indexed array nums comprising of n non-negative integers.

In one operation, you must:

  • Choose an integer i such that 1 <= i < n and nums[i] > 0.
  • Decrease nums[i] by 1.
  • Increase nums[i - 1] by 1.

Return the minimum possible value of the maximum integer of nums after performing any number of operations.

Solution

/**
 * @param {number[]} nums
 * @return {number}
 */
var minimizeArrayValue = function(nums) {
  let left = 0;
  let right = Math.max(...nums);
  let result = right;

  while (left <= right) {
    const mid = Math.floor((left + right) / 2);
    let carry = 0;
    let valid = true;

    for (let i = nums.length - 1; i >= 0; i--) {
      const total = nums[i] + carry;
      if (total > mid) {
        if (i === 0) {
          valid = false;
          break;
        }
        carry = total - mid;
      } else {
        carry = 0;
      }
    }

    if (valid) {
      result = mid;
      right = mid - 1;
    } else {
      left = mid + 1;
    }
  }

  return result;
};