Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

README.md

You are given an integer array nums sorted in non-decreasing order.

Build and return an integer array result with the same length as nums such that result[i] is equal to the summation of absolute differences between nums[i] and all the other elements in the array.

In other words, result[i] is equal to sum(|nums[i]-nums[j]|) where 0 <= j < nums.length and j != i (0-indexed).

 

Example 1:

Input: nums = [2,3,5]
Output: [4,3,5]
Explanation: Assuming the arrays are 0-indexed, then
result[0] = |2-2| + |2-3| + |2-5| = 0 + 1 + 3 = 4,
result[1] = |3-2| + |3-3| + |3-5| = 1 + 0 + 2 = 3,
result[2] = |5-2| + |5-3| + |5-5| = 3 + 2 + 0 = 5.

Example 2:

Input: nums = [1,4,6,8,10]
Output: [24,15,13,15,21]

 

Constraints:

  • 2 <= nums.length <= 105
  • 1 <= nums[i] <= nums[i + 1] <= 104

Related Topics:
Array, Math, Prefix Sum

Solution 1.

For each A[i], the corresponding ans[i] is

SUM( A[j] | j >= i ) - COUNT( j >= i )
+ SUM( A[j] | j < i ) - COUNT( j < i )
// OJ: https://leetcode.com/problems/sum-of-absolute-differences-in-a-sorted-array/
// Author: github.com/lzl124631x
// Time: O(N)
// Space: O(1) extra space
class Solution {
public:
    vector<int> getSumAbsoluteDifferences(vector<int>& A) {
        long total = accumulate(begin(A), end(A), 0L), right = total, N = A.size();
        vector<int> ans(N);
        for (int i = 0; i < N; ++i) {
            ans[i] = right - (N - i) * A[i] + i * A[i] - (total - right);
            right -= A[i];
        }
        return ans;
    }
};