class Solution:
def getSumAbsoluteDifferences(self, nums):
n = len(nums)
prefix = [0] * (n + 1)
for i in range(n):
prefix[i+1] = prefix[i] + nums[i]
res = []
for i in range(n):
left = i * nums[i] - prefix[i]
right = (prefix[n] - prefix[i+1]) - (n - i - 1) * nums[i]
res.append(left + right)
return res
class Solution {
public:
vector<int> getSumAbsoluteDifferences(vector<int>& nums) {
int n = nums.size();
vector<int> prefix(n + 1, 0);
for (int i = 0; i < n; ++i)
prefix[i+1] = prefix[i] + nums[i];
vector<int> res(n);
for (int i = 0; i < n; ++i) {
int left = i * nums[i] - prefix[i];
int right = (prefix[n] - prefix[i+1]) - (n - i - 1) * nums[i];
res[i] = left + right;
}
return res;
}
};
class Solution {
public int[] getSumAbsoluteDifferences(int[] nums) {
int n = nums.length;
int[] prefix = new int[n + 1];
for (int i = 0; i < n; ++i)
prefix[i+1] = prefix[i] + nums[i];
int[] res = new int[n];
for (int i = 0; i < n; ++i) {
int left = i * nums[i] - prefix[i];
int right = (prefix[n] - prefix[i+1]) - (n - i - 1) * nums[i];
res[i] = left + right;
}
return res;
}
}
var getSumAbsoluteDifferences = function(nums) {
let n = nums.length;
let prefix = new Array(n + 1).fill(0);
for (let i = 0; i < n; ++i)
prefix[i+1] = prefix[i] + nums[i];
let res = new Array(n);
for (let i = 0; i < n; ++i) {
let left = i * nums[i] - prefix[i];
let right = (prefix[n] - prefix[i+1]) - (n - i - 1) * nums[i];
res[i] = left + right;
}
return res;
};
nums
array of integers sorted in non-decreasing order, you are asked to compute, for each index i
, the sum of absolute differences between nums[i]
and every other element in the array. In other words, for each index i
, compute:
result[i] = |nums[i] - nums[0]| + |nums[i] - nums[1]| + ... + |nums[i] - nums[n-1]|
nums
is sorted in non-decreasing order.|nums[i] - nums[i]| = 0
, including it does not affect the sum.i
, looping through the array and summing up the differences, resulting in a brute-force approach with O(n2) time complexity.
i
, nums[i] - nums[j]
is always non-negative.i
, nums[j] - nums[i]
is always non-negative.prefix
where prefix[i]
is the sum of the first i
elements of nums
. This allows us to quickly compute the sum of any subarray.i
:
j < i
, the sum of differences is (i * nums[i] - prefix[i])
. This comes from the fact that there are i
elements before i
, and each difference is nums[i] - nums[j]
.j > i
, the sum of differences is ((prefix[n] - prefix[i+1]) - (n - i - 1) * nums[i])
. Here, prefix[n] - prefix[i+1]
is the sum of all elements after i
, and each difference is nums[j] - nums[i]
.i
.nums = [2, 3, 5]
prefix[0] = 0
prefix[1] = 2
prefix[2] = 2 + 3 = 5
prefix[3] = 5 + 5 = 10
prefix = [0, 2, 5, 10]
.
0 * 2 - 0 = 0
(10 - 2) - (3 - 0 - 1) * 2 = 8 - 2*2 = 8 - 4 = 4
0 + 4 = 4
1 * 3 - 2 = 3 - 2 = 1
(10 - 5) - (3 - 1 - 1) * 3 = 5 - 1*3 = 5 - 3 = 2
1 + 2 = 3
2 * 5 - 5 = 10 - 5 = 5
(10 - 10) - (3 - 2 - 1) * 5 = 0 - 0*5 = 0
5 + 0 = 5
[4, 3, 5]