Sum of Absolute Differences in a Sorted Array

medium prefix sum math

Problem

Given a sorted non-decreasing array nums, return result where result[i] = sum over j of |nums[i] − nums[j]|.

Inputnums = [2,3,5]
Output[4,3,5]
i=0: |2-3|+|2-5|=4. i=1: 1+2=3. i=2: 3+2=5.

def get_sum_absolute_differences(nums):
    n = len(nums)
    total = sum(nums)
    left = 0
    out = []
    for i, x in enumerate(nums):
        right = total - left - x
        out.append(i * x - left + (right - (n - 1 - i) * x))
        left += x
    return out
function getSumAbsoluteDifferences(nums) {
  const n = nums.length;
  let total = 0;
  for (const x of nums) total += x;
  let left = 0;
  const out = new Array(n);
  for (let i = 0; i < n; i++) {
    const x = nums[i];
    const right = total - left - x;
    out[i] = i * x - left + (right - (n - 1 - i) * x);
    left += x;
  }
  return out;
}
class Solution {
    public int[] getSumAbsoluteDifferences(int[] nums) {
        int n = nums.length;
        long total = 0;
        for (int x : nums) total += x;
        long left = 0;
        int[] out = new int[n];
        for (int i = 0; i < n; i++) {
            long x = nums[i];
            long right = total - left - x;
            out[i] = (int) (i * x - left + (right - (n - 1 - i) * x));
            left += x;
        }
        return out;
    }
}
vector<int> getSumAbsoluteDifferences(vector<int>& nums) {
    int n = nums.size();
    long total = 0;
    for (int x : nums) total += x;
    long left = 0;
    vector<int> out(n);
    for (int i = 0; i < n; i++) {
        long x = nums[i];
        long right = total - left - x;
        out[i] = (int)(i * x - left + (right - (long)(n - 1 - i) * x));
        left += x;
    }
    return out;
}
Time: O(n) Space: O(n)