目标
给你一个下标从 0 开始的长度为 n 的整数数组 nums。
定义两个数组 leftSum 和 rightSum,其中:
- leftSum[i] 是数组 nums 中下标 i 左侧元素之和。如果不存在对应的元素,leftSum[i] = 0 。
- rightSum[i] 是数组 nums 中下标 i 右侧元素之和。如果不存在对应的元素,rightSum[i] = 0 。
返回长度为 n 数组 answer,其中 answer[i] = |leftSum[i] - rightSum[i]|。
示例 1:
输入:nums = [10,4,8,3]
输出:[15,1,11,22]
解释:数组 leftSum 为 [0,10,14,22] 且数组 rightSum 为 [15,11,3,0] 。
数组 answer 为 [|0 - 15|,|10 - 11|,|14 - 3|,|22 - 0|] = [15,1,11,22] 。
示例 2:
输入:nums = [1]
输出:[0]
解释:数组 leftSum 为 [0] 且数组 rightSum 为 [0] 。
数组 answer 为 [|0 - 0|] = [0] 。
说明:
- 1 <= nums.length <= 1000
- 1 <= nums[i] <= 10^5
思路
有一个正整数数组 nums,leftSum[i] 表示下标 i 左侧的元素之和,rightSum[i] 表示下标 i 右侧的元素之和,返回结果数组 answer,answer[i] = abs(leftSum[i] - rightSum[i])。
依题意模拟
totalSum = leftSum[i] + nums[i] + rightSum[i],answer[i] = abs(leftSum[i] - (totalSum - leftSum[i] - nums[i])) = abs(leftSum[i] + leftSum[i + 1] - totalSum) = abs(leftSum[i] + leftSum[i + 1] - leftSum[n])
计算出前缀和,然后根据返填答案即可。
代码
/**
* @date 2026-06-08 11:59
*/
public class LeftRightDifference2574 {
public int[] leftRightDifference(int[] nums) {
int n = nums.length;
int[] res = new int[n];
int[] prefix = new int[n + 1];
for (int i = 0; i < n; i++) {
prefix[i + 1] = prefix[i] + nums[i];
}
for (int i = 0; i < n; i++) {
res[i] = Math.abs(prefix[i] - (prefix[n] - prefix[i + 1]));
}
return res;
}
}
性能
