2574. 左右元素和的差值
March 28, 2026 · View on GitHub
题目描述
给你一个下标从 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 <= 10001 <= nums[i] <= 105
解法
方法一:前缀和
我们定义变量 表示数组 中下标 左侧元素之和,变量 表示数组 中下标 右侧元素之和。初始时 , 。
遍历数组 ,对于当前遍历到的数字 ,我们更新 ,此时 和 分别表示数组 中下标 左侧元素之和和右侧元素之和。我们将 和 的差的绝对值加入答案数组 中,然后更新 。
遍历结束,返回答案数组 即可。
时间复杂度 ,其中 是数组 的长度。空间复杂度 ,不考虑返回值的空间。
相似题目:
Python3
class Solution:
def leftRightDifference(self, nums: List[int]) -> List[int]:
l, r = 0, sum(nums)
ans = []
for x in nums:
r -= x
ans.append(abs(l - r))
l += x
return ans
Java
class Solution {
public int[] leftRightDifference(int[] nums) {
int l = 0, r = 0;
for (int x : nums) {
r += x;
}
int n = nums.length;
int[] ans = new int[n];
for (int i = 0; i < n; ++i) {
r -= nums[i];
ans[i] = Math.abs(l - r);
l += nums[i];
}
return ans;
}
}
C++
class Solution {
public:
vector<int> leftRightDifference(vector<int>& nums) {
int l = 0, r = 0;
for (int x : nums) {
r += x;
}
int n = nums.size();
vector<int> ans(n);
for (int i = 0; i < n; ++i) {
r -= nums[i];
ans[i] = abs(l - r);
l += nums[i];
}
return ans;
}
};
Go
func leftRightDifference(nums []int) []int {
l, r := 0, 0
for _, x := range nums {
r += x
}
n := len(nums)
ans := make([]int, n)
for i, x := range nums {
r -= x
ans[i] = abs(l - r)
l += x
}
return ans
}
func abs(x int) int {
if x < 0 {
return -x
}
return x
}
TypeScript
function leftRightDifference(nums: number[]): number[] {
let [l, r] = [0, nums.reduce((a, b) => a + b, 0)];
const ans: number[] = [];
for (const x of nums) {
r -= x;
ans.push(Math.abs(l - r));
l += x;
}
return ans;
}
Rust
impl Solution {
pub fn left_right_difference(nums: Vec<i32>) -> Vec<i32> {
let mut l = 0;
let mut r: i32 = nums.iter().sum();
let mut ans = Vec::with_capacity(nums.len());
for x in nums {
r -= x;
ans.push((l - r).abs());
l += x;
}
ans
}
}
C
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* leftRightDifference(int* nums, int numsSize, int* returnSize) {
*returnSize = numsSize;
int* ans = (int*) malloc(sizeof(int) * numsSize);
int l = 0, r = 0;
for (int i = 0; i < numsSize; ++i) {
r += nums[i];
}
for (int i = 0; i < numsSize; ++i) {
r -= nums[i];
ans[i] = abs(l - r);
l += nums[i];
}
return ans;
}