Minimum Average Difference

medium array prefix sum

Problem

Return the smallest index i minimizing |avg(nums[0..i]) − avg(nums[i+1..n−1])| where averages are integer floors. If the right side is empty, its average is 0.

Inputnums = [2, 5, 3, 9, 5, 3]
Output3
At i=3, left avg = 4, right avg = 4, diff = 0.

def minimum_average_difference(nums):
    n = len(nums)
    total = sum(nums)
    left = 0
    best = float('inf')
    ans = 0
    for i, x in enumerate(nums):
        left += x
        right_cnt = n - i - 1
        left_avg = left // (i + 1)
        right_avg = (total - left) // right_cnt if right_cnt > 0 else 0
        diff = abs(left_avg - right_avg)
        if diff < best:
            best = diff
            ans = i
    return ans
function minimumAverageDifference(nums) {
  const n = nums.length;
  let total = 0;
  for (const x of nums) total += x;
  let left = 0, best = Infinity, ans = 0;
  for (let i = 0; i < n; i++) {
    left += nums[i];
    const rc = n - i - 1;
    const la = Math.floor(left / (i + 1));
    const ra = rc > 0 ? Math.floor((total - left) / rc) : 0;
    const diff = Math.abs(la - ra);
    if (diff < best) { best = diff; ans = i; }
  }
  return ans;
}
class Solution {
    public int minimumAverageDifference(int[] nums) {
        int n = nums.length;
        long total = 0;
        for (int x : nums) total += x;
        long left = 0;
        long best = Long.MAX_VALUE;
        int ans = 0;
        for (int i = 0; i < n; i++) {
            left += nums[i];
            int rc = n - i - 1;
            long la = left / (i + 1);
            long ra = rc > 0 ? (total - left) / rc : 0;
            long diff = Math.abs(la - ra);
            if (diff < best) { best = diff; ans = i; }
        }
        return ans;
    }
}
int minimumAverageDifference(vector<int>& nums) {
    int n = nums.size();
    long long total = 0;
    for (int x : nums) total += x;
    long long left = 0, best = LLONG_MAX;
    int ans = 0;
    for (int i = 0; i < n; i++) {
        left += nums[i];
        int rc = n - i - 1;
        long long la = left / (i + 1);
        long long ra = rc > 0 ? (total - left) / rc : 0;
        long long diff = abs(la - ra);
        if (diff < best) { best = diff; ans = i; }
    }
    return ans;
}
Time: O(n) Space: O(1)