Maximum Value at a Given Index in a Bounded Array

medium binary search math

Problem

Build an array of length n, positives, adjacent differ ≤1, total ≤ maxSum. Maximize arr[index].

Inputn = 4, index = 2, maxSum = 6
Output2
[1,1,2,1] sums to 5 ≤ 6; can't reach 3.

def max_value(n, index, maxSum):
    def cost(side, peak):
        if peak > side:
            return (peak + (peak - side + 1)) * side // 2
        return (peak * (peak + 1)) // 2 + (side - peak)
    lo, hi = 1, maxSum
    while lo < hi:
        mid = (lo + hi + 1) // 2
        total = mid + cost(index, mid - 1) + cost(n - index - 1, mid - 1)
        if total <= maxSum:
            lo = mid
        else:
            hi = mid - 1
    return lo
function maxValue(n, index, maxSum) {
  function cost(side, peak) {
    if (peak > side) return ((peak + (peak - side + 1)) * side) / 2;
    return (peak * (peak + 1)) / 2 + (side - peak);
  }
  let lo = 1, hi = maxSum;
  while (lo < hi) {
    const mid = Math.floor((lo + hi + 1) / 2);
    const total = mid + cost(index, mid - 1) + cost(n - index - 1, mid - 1);
    if (total <= maxSum) lo = mid; else hi = mid - 1;
  }
  return lo;
}
class Solution {
    long cost(long side, long peak) {
        if (peak > side) return (peak + (peak - side + 1)) * side / 2;
        return peak * (peak + 1) / 2 + (side - peak);
    }
    public int maxValue(int n, int index, int maxSum) {
        long lo = 1, hi = maxSum;
        while (lo < hi) {
            long mid = (lo + hi + 1) / 2;
            long total = mid + cost(index, mid - 1) + cost(n - index - 1, mid - 1);
            if (total <= maxSum) lo = mid; else hi = mid - 1;
        }
        return (int) lo;
    }
}
long cost(long side, long peak) {
    if (peak > side) return (peak + (peak - side + 1)) * side / 2;
    return peak * (peak + 1) / 2 + (side - peak);
}
int maxValue(int n, int index, int maxSum) {
    long lo = 1, hi = maxSum;
    while (lo < hi) {
        long mid = (lo + hi + 1) / 2;
        long total = mid + cost(index, mid - 1) + cost(n - index - 1, mid - 1);
        if (total <= maxSum) lo = mid; else hi = mid - 1;
    }
    return (int) lo;
}
Time: O(log maxSum) Space: O(1)