力扣刷题日记-1685-有序数组中差绝对值之和

62 阅读1分钟
  • 给你一个 非递减 有序整数数组 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
};