LeetCode 算法: 一维数组的动态和

145 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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
  • 106-10^6<= nums[i] <=10610^6

思路分析

方法一

  1. 遇到数组的算法题,第一时间想到的是遍历数组然后处理对应的逻辑;
  2. 那么,按照题目分析,可以得知,最后返回的结果数组中的第 N 项,是被处理数组前 N 项的和;
  3. 定义一个初始变量 count0,定义结果数组 res
  4. 遍历数组,使用 count 存储相加后的值,同时将获得的值 push 到结果数组 res 中;
  5. 返回 res 即可。

方法二

  1. 使用过数组 API 的同学都知道,像这种求和的问题通常都可以使用 reduce 来解决;
  2. 定义一个结果数组 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 为初值来进行求和,那么过程中返回的结果为:

次数prevcurrindexreturn
10101
21213
33326
464310

END