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


我们可以利用前缀和的思想高效计算结果数组 result,而不是暴力枚举所有可能的 |nums[i] - nums[j]| 计算。
思路
- 前缀和计算累积和:
- 计算
nums的前缀和数组prefix_sum,其中prefix_sum[i]代表nums[0]到nums[i-1]的和。
- 计算
- 计算
result[i]:- 对于某个索引
i:- 左侧元素贡献:
i个nums[i]减去prefix_sum[i],即i * nums[i] - prefix_sum[i] - 右侧元素贡献:后缀和减去
nums[i]的贡献,即(prefix_sum[n] - prefix_sum[i+1]) - (n - i - 1) * 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²) 方法要快得多!
736

被折叠的 条评论
为什么被折叠?



