携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情
一维数组的动态和
给你一个数组 nums 。数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]…nums[i]) 。
请返回 nums 的动态和。
示例 1:
输入:nums = [1,2,3,4]
输出:[1,3,6,10]
解释:动态和计算过程为 [1, 1+2, 1+2+3, 1+2+3+4] 。
示例 2:
输入:nums = [1,1,1,1,1]
输出:[1,2,3,4,5]
解释:动态和计算过程为 [1, 1+1, 1+1+1, 1+1+1+1, 1+1+1+1+1] 。
示例 3:
输入:nums = [3,1,2,10,1]
输出:[3,4,6,16,17]
提示:
1 <= nums.length <= 1000<= nums[i] <=
思路分析
方法一
- 遇到数组的算法题,第一时间想到的是遍历数组然后处理对应的逻辑;
- 那么,按照题目分析,可以得知,最后返回的结果数组中的第
N项,是被处理数组前N项的和; - 定义一个初始变量
count为0,定义结果数组res; - 遍历数组,使用
count存储相加后的值,同时将获得的值push到结果数组res中; - 返回
res即可。
方法二
- 使用过数组
API的同学都知道,像这种求和的问题通常都可以使用 reduce 来解决; - 定义一个结果数组
res,然后使用reduce求和,再求和的过程中,把每次求和的值存储到res中,返回即可。
AC 代码
方法一
/**
* @param {number[]} nums
* @return {number[]}
*/
var runningSum = function(nums) {
let count = 0
const res = []
for(let i = 0; i < nums.length; i++) {
count += nums[i]
res.push(count)
}
return res
};
结果:
- 执行结果: 通过
- 执行用时:76 ms, 在所有 JavaScript 提交中击败了9.89%的用户
- 内存消耗:40.8 MB, 在所有 JavaScript 提交中击败了98.90%的用户
- 通过测试用例:53 / 53
方法二
/**
* @param {number[]} nums
* @return {number[]}
*/
var runningSum = function(nums) {
const res = []
nums.reduce((prev, curr, index) => {
res.push(prev + curr)
return prev + curr
}, 0)
return res
};
结果:
- 执行结果: 通过
- 执行用时:68 ms, 在所有 JavaScript 提交中击败了28.92%的用户
- 内存消耗:41.2 MB, 在所有 JavaScript 提交中击败了88.46%的用户
- 通过测试用例:53 / 53
reduce
来看下 reduce 返回的结果,以 [1,2,3,4] 为例,0 为初值来进行求和,那么过程中返回的结果为:
| 次数 | prev | curr | index | return |
|---|---|---|---|---|
| 1 | 0 | 1 | 0 | 1 |
| 2 | 1 | 2 | 1 | 3 |
| 3 | 3 | 3 | 2 | 6 |
| 4 | 6 | 4 | 3 | 10 |