【leetcode】1685. Sum of Absolute Differences in a Sorted Array
题目如下:
You are given an integer array
nums
sorted in non-decreasing order.Build and return an integer array
result
with the same length asnums
such thatresult[i]
is equal to the summation of absolute differences betweennums[i]
and all the other elements in the array.In other words,
result[i]
is equal tosum(|nums[i]-nums[j]|)
where0 <= j < nums.length
andj != 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
解题思路:对于nums[i],我们很容易可以求出0~i-1区间和total_left以及i+1~nums.length-1的区间和total_right,那么对于左半部分的sum有:i*nums[i] - total_left,右半部分有:total_right - (len(nums) - i - 1)*nums[i]。
代码如下:
class Solution(object): def getSumAbsoluteDifferences(self, nums): """ :type nums: List[int] :rtype: List[int] """ total = [] count = 0 for i in nums: count += i total.append(count) res = [] for i in range(0,len(nums)): left = right = 0 if i > 0: left = i*nums[i] - total[i-1] if i < len(nums) - 1: right = (total[-1] - total[i]) - (len(nums) - i - 1)*nums[i] res.append(left + right) return res