python-leetcode-1685. 有序数组中差绝对值之和

1685. 有序数组中差绝对值之和 - 力扣(LeetCode)

我们可以利用前缀和的思想高效计算结果数组 result,而不是暴力枚举所有可能的 |nums[i] - nums[j]| 计算。

思路

  1. 前缀和计算累积和
    • 计算 nums 的前缀和数组 prefix_sum,其中 prefix_sum[i] 代表 nums[0]nums[i-1] 的和。
  2. 计算 result[i]
    • 对于某个索引 i
      • 左侧元素贡献inums[i] 减去 prefix_sum[i],即 i * nums[i] - prefix_sum[i]
      • 右侧元素贡献:后缀和减去 nums[i] 的贡献,即 (prefix_sum[n] - prefix_sum[i+1]) - (n - i - 1) * nums[i]
    • 公式: result[i] = i \times nums[i] - \text{prefix\_sum}[i] + (\text{prefix\_sum}[n] - \text{prefix\_sum}[i+1]) - (n-i-1) \times nums[i]

代码

from typing import List

def getSumAbsoluteDifferences(nums: List[int]) -> List[int]:
    n = len(nums)
    prefix_sum = [0] * (n + 1)

    # 计算前缀和
    for i in range(n):
        prefix_sum[i + 1] = prefix_sum[i] + nums[i]

    result = [0] * n
    for i in range(n):
        left_sum = i * nums[i] - prefix_sum[i]
        right_sum = (prefix_sum[n] - prefix_sum[i + 1]) - (n - i - 1) * nums[i]
        result[i] = left_sum + right_sum

    return result

复杂度分析

  • 计算前缀和数组:O(n)
  • 遍历数组计算 result[i]:O(n)
  • 总时间复杂度:O(n)
  • 额外空间复杂度:O(n)(存储 prefix_sum

这种方法比直接遍历所有 j 的 O(n²) 方法要快得多!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值