持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情
一、题目描述:
给你一个数组 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
- -10^6 <= nums[i] <= 10^6
二、思路分析:
我原本是想创建一个变量用来储存每次的和的值
然后每次循环这个值进行改变,把它每次的变化用一个数组储存起来,最后返回这个数组。
后面发现可以用原本的传入数组来记录这个值的改变
初始第一个的数组的值不会发生变动,所以我们的下标i从1开始
需要循环进行n-1次,每次i的位置的值用来存储i位置原本的值与i-1位置的值的和
每循环一次,原始数组更新一次数据
循环进行完以后,这个数组里面的值就是对应原始数组动态和的值,将该数组返回即可。
可以很容易知道这个公式: sum[i] = nums[0]+...+nums[i]
仔细观察这个公式,我们可以发现当 i + 1,新公式为: sum[i + 1] = nums[0]+...+nums[i + 1]
我们可以发现,sum[i + 1]的公式中,sum[i]的计算是重复的,我们可以将该公式再简化为如下:
sum[i + 1] = sum[i] + nums[i + 1]
根据该公式,可以很简单的写出我们的解题代码,并且不需要耗费任何额外空间,它们很明显是可以直接在原数组上原地操作的。
三、AC 代码:
class Solution {
public int[] runningSum(int[] nums) {
if(nums.length == 1) {
return nums;
}
for (int i = 1; i < nums.length; i++) {
nums[i] += nums[i - 1];
}
return nums;
}
}