Easy
题目描述
给你一个数组 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) 个数字计算出动态和中的第 i 个数字。
解题思路
这道题是典型的前缀和问题,有两种主要解法:
方法一:新建结果数组(推荐)
创建一个新的结果数组,每个位置存储从开头到当前位置的累积和。具体实现:
- 第一个元素直接复制原数组第一个元素
- 从第二个元素开始,每个位置的值等于前一个位置的值加上当前原数组的值
- 这样可以保持代码清晰,易于理解
方法二:原地修改
直接在原数组上进行修改,从第二个元素开始,将每个元素更新为当前元素与前一个元素的和。这种方法可以节省额外的空间,但会修改原数组。
方法三:使用累加变量
维护一个累加变量,遍历数组时不断累加,并将结果存入结果数组。
三种方法的时间复杂度都是O(n),但在空间使用和代码可读性上有所不同。考虑到题目没有要求原地修改,推荐使用方法一,既保持了代码的清晰性,又不会影响原始数据。
代码实现
class Solution {
public:
vector<int> runningSum(vector<int>& nums) {
vector<int> result(nums.size());
result[0] = nums[0];
for (int i = 1; i < nums.size(); i++) {
result[i] = result[i-1] + nums[i];
}
return result;
}
};
class Solution:
def runningSum(self, nums: List[int]) -> List[int]:
result = [nums[0]]
for i in range(1, len(nums)):
result.append(result[-1] + nums[i])
return result
public class Solution {
public int[] RunningSum(int[] nums) {
int[] result = new int[nums.Length];
result[0] = nums[0];
for (int i = 1; i < nums.Length; i++) {
result[i] = result[i-1] + nums[i];
}
return result;
}
}
var runningSum = function(nums) {
const result = [nums[0]];
for (let i = 1; i < nums.length; i++) {
result[i] = result[i-1] + nums[i];
}
return result;
};
复杂度分析
| 复杂度类型 | 复杂度 | 说明 |
|---|---|---|
| 时间复杂度 | O(n) | 需要遍历数组一次,n为数组长度 |
| 空间复杂度 | O(n) | 需要创建结果数组存储动态和 |