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] = 0prefix[1] = 2prefix[2] = 2 + 3 = 5prefix[3] = 5 + 5 = 10prefix = [0, 2, 5, 10].
0 * 2 - 0 = 0(10 - 2) - (3 - 0 - 1) * 2 = 8 - 2*2 = 8 - 4 = 40 + 4 = 4
1 * 3 - 2 = 3 - 2 = 1(10 - 5) - (3 - 1 - 1) * 3 = 5 - 1*3 = 5 - 3 = 21 + 2 = 3
2 * 5 - 5 = 10 - 5 = 5(10 - 10) - (3 - 2 - 1) * 5 = 0 - 0*5 = 05 + 0 = 5
[4, 3, 5]