左右元素和的差值
难度:
标签:
题目描述
Given a 0-indexed integer array nums
, find a 0-indexed integer array answer
where:
answer.length == nums.length
.answer[i] = |leftSum[i] - rightSum[i]|
.
Where:
leftSum[i]
is the sum of elements to the left of the indexi
in the arraynums
. If there is no such element,leftSum[i] = 0
.rightSum[i]
is the sum of elements to the right of the indexi
in the arraynums
. If there is no such element,rightSum[i] = 0
.
Return the array answer
.
Example 1:
Input: nums = [10,4,8,3] Output: [15,1,11,22] Explanation: The array leftSum is [0,10,14,22] and the array rightSum is [15,11,3,0]. The array answer is [|0 - 15|,|10 - 11|,|14 - 3|,|22 - 0|] = [15,1,11,22].
Example 2:
Input: nums = [1] Output: [0] Explanation: The array leftSum is [0] and the array rightSum is [0]. The array answer is [|0 - 0|] = [0].
Constraints:
1 <= nums.length <= 1000
1 <= nums[i] <= 105
代码结果
运行时间: 27 ms, 内存: 16.3 MB
/*
* 题目思路:
* 通过使用 Java Stream 来计算 leftSum 和 rightSum。
* 我们首先使用 Stream 来生成 leftSum 和 rightSum,
* 然后用 mapToInt 方法计算绝对值差。
*/
import java.util.stream.*;
public class Solution {
public int[] leftRightDifference(int[] nums) {
int n = nums.length;
int[] leftSum = new int[n];
int[] rightSum = new int[n];
// 计算 leftSum 数组
IntStream.range(1, n).forEach(i -> leftSum[i] = leftSum[i - 1] + nums[i - 1]);
// 计算 rightSum 数组
IntStream.iterate(n - 2, i -> i >= 0, i -> i - 1).forEach(i -> rightSum[i] = rightSum[i + 1] + nums[i + 1]);
// 计算 answer 数组
return IntStream.range(0, n)
.map(i -> Math.abs(leftSum[i] - rightSum[i]))
.toArray();
}
}
解释
方法:
题解采用一次遍历的方法计算左右和的差的绝对值。首先,初始化leftsum为0(因为第一个元素左侧无元素),rightsum为除了第一个元素外的所有元素之和。然后遍历数组,每到一个新的元素i,计算当前的leftsum和rightsum的差的绝对值,并更新leftsum和rightsum,以便在下一次循环时使用。leftsum每次增加当前元素nums[i],而rightsum减去下一个元素nums[i+1](这是因为该元素将从右侧和中移除)。最后,将最后一个元素的差的绝对值也添加到结果中。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
在算法的描述中,如何处理数组中只有一个元素的情况?
▷🦆
为什么在for循环的迭代中不包括数组的最后一个元素,然后在循环外单独处理?是否有可能在循环内部一次性处理完所有元素?
▷🦆
在更新rightsum时,如果当前元素是数组的最后一个元素,减去nums[i+1]是否会导致数组越界错误?
▷