- 给你一个 非递减 有序整数数组 nums 。
请你建立并返回一个整数数组 result,它跟 nums 长度相同,且result[i] 等于 nums[i] 与数组中所有其他元素差的绝对值之和。
换句话说, result[i] 等于 sum(|nums[i]-nums[j]|) ,其中 0 <= j < nums.length 且 j != i (下标从 0 开始)。
示例 1:
输入:nums = [2,3,5] 输出:[4,3,5] 解释:假设数组下标从 0 开始,那么 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。 示例 2:
输入:nums = [1,4,6,8,10] 输出:[24,15,13,15,21]
思路: 画一个递增的柱状图,求减去的阴影面积,推导出一个通用型的公式.
/**
* @param {number[]} nums
* @return {number[]}
*/
var getSumAbsoluteDifferences = function(nums) {
// 暴力无法通过测试
// let res = []
// for(let i = 0; i < nums.length; i++) {
// let cur = nums[i], sum = 0
// for(let j = 0; j < nums.length; j++) {
// sum += Math.abs(cur - nums[j])
// }
// res.push(sum)
// }
// return res
// 动态规划
let sum = 0, result = []
for(let i = 0; i < nums.length; i++) {
sum += nums[i]
}
result[0] = sum - nums[0] * nums.length
console.log(result[0])
for(let i = 1; i < nums.length; i++) {
result[i] = result[i - 1] - (nums.length - 2*i)*(nums[i] - nums[i - 1])
}
return result
};