Description
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 <= 10^5
1 <= nums[i] <= nums[i + 1] <= 10^4
Solution
Since it’s absolute difference, the result[i]
is:
R
[
i
]
=
n
u
m
s
[
i
]
−
n
u
m
s
[
j
1
]
+
n
u
m
s
[
i
]
−
n
u
m
s
[
j
2
]
+
…
⏟
numbers that are at the left of i
+
n
u
m
s
[
k
1
]
−
n
u
m
s
[
i
]
+
n
u
m
s
[
k
2
]
−
n
u
m
s
[
i
]
+
…
⏟
numbers that are at the right of i
R[i] = \underbrace{nums[i] - nums[j_1] + nums[i] - nums[j_2] + \dots}_{\text{numbers that are at the left of i}} + \underbrace{nums[k_1] - nums[i] + nums[k_2] - nums[i] + \dots}_{\text{numbers that are at the right of i}}
R[i]=numbers that are at the left of i
nums[i]−nums[j1]+nums[i]−nums[j2]+…+numbers that are at the right of i
nums[k1]−nums[i]+nums[k2]−nums[i]+…
So we use 2 variables to store the sum, and go through the list once.
Time complexity:
o
(
n
)
o(n)
o(n)
Space complexity:
o
(
1
)
o(1)
o(1)
Code
class Solution:
def getSumAbsoluteDifferences(self, nums: List[int]) -> List[int]:
all_sum = sum(nums)
pre_sum = 0
res = []
n = len(nums)
for i, each_num in enumerate(nums):
all_sum -= each_num
res.append(all_sum - (n - i - 1) * each_num + i * each_num - pre_sum)
pre_sum += each_num
return res