前缀和题目:一维数组的动态和
文章目录
- 题目
- 标题和出处
- 难度
- 题目描述
- 要求
- 示例
- 数据范围
- 解法一
- 思路和算法
- 代码
- 复杂度分析
- 解法二
- 思路和算法
- 代码
- 复杂度分析
题目
标题和出处
标题:一维数组的动态和
出处:1480. 一维数组的动态和
难度
1 级
题目描述
要求
给定一个数组 nums \texttt{nums} nums。数组动态和的计算公式为: runningSum[i] = sum(nums[0] ... nums[i]) \texttt{runningSum[i] = sum(nums[0] ... nums[i])} runningSum[i] = sum(nums[0] ... nums[i])。
返回 nums \texttt{nums} nums 的动态和。
示例
示例 1:
输入: nums = [1,2,3,4] \texttt{nums = [1,2,3,4]} nums = [1,2,3,4]
输出: [1,3,6,10] \texttt{[1,3,6,10]} [1,3,6,10]
解释:动态和计算过程为 [1, 1+2, 1+2+3, 1+2+3+4] \texttt{[1, 1+2, 1+2+3, 1+2+3+4]} [1, 1+2, 1+2+3, 1+2+3+4]。
示例 2:
输入: nums = [1,1,1,1,1] \texttt{nums = [1,1,1,1,1]} nums = [1,1,1,1,1]
输出: [1,2,3,4,5] \texttt{[1,2,3,4,5]} [1,2,3,4,5]
解释:动态和计算过程为 [1, 1+1, 1+1+1, 1+1+1+1, 1+1+1+1+1] \texttt{[1, 1+1, 1+1+1, 1+1+1+1, 1+1+1+1+1]} [1, 1+1, 1+1+1, 1+1+1+1, 1+1+1+1+1]。
示例 3:
输入: nums = [3,1,2,10,1] \texttt{nums = [3,1,2,10,1]} nums = [3,1,2,10,1]
输出: [3,4,6,16,17] \texttt{[3,4,6,16,17]} [3,4,6,16,17]
数据范围
- 1 ≤ nums.length ≤ 1000 \texttt{1} \le \texttt{nums.length} \le \texttt{1000} 1≤nums.length≤1000
- -10 6 ≤ nums[i] ≤ 10 6 \texttt{-10}^\texttt{6} \le \texttt{nums[i]} \le \texttt{10}^\texttt{6} -106≤nums[i]≤106
解法一
思路和算法
用数组 sums \textit{sums} sums 表示数组 nums \textit{nums} nums 的动态和。根据动态和的定义, sums [ i ] \textit{sums}[i] sums[i] 等于 nums \textit{nums} nums 的下标范围 [ 0 , i ] [0, i] [0,i] 中的所有元素之和,因此可以直接计算动态和。
代码
class Solution {public int[] runningSum(int[] nums) {int length = nums.length;int[] sums = new int[length];for (int i = 0; i < length; i++) {for (int j = 0; j <= i; j++) {sums[i] += nums[j];}}return sums;}
}
复杂度分析
-
时间复杂度: O ( n 2 ) O(n^2) O(n2),其中 n n n 是数组 nums \textit{nums} nums 的长度。计算每个元素的动态和的时间是 O ( n ) O(n) O(n),时间复杂度是 O ( n 2 ) O(n^2) O(n2)。
-
空间复杂度: O ( 1 ) O(1) O(1)。注意返回值不计入空间复杂度。
解法二
思路和算法
根据动态和的定义, sums [ 0 ] = nums [ 0 ] \textit{sums}[0] = \textit{nums}[0] sums[0]=nums[0]。当 i > 0 i > 0 i>0 时, sums [ i ] − sums [ i − 1 ] = nums [ i ] \textit{sums}[i] - \textit{sums}[i - 1] = \textit{nums}[i] sums[i]−sums[i−1]=nums[i],因此 sums [ i ] = sums [ i − 1 ] + nums [ i ] \textit{sums}[i] = \textit{sums}[i - 1] + \textit{nums}[i] sums[i]=sums[i−1]+nums[i]。按照下标从小到大的顺序依次计算每个元素的动态和,则计算每个元素的动态和的时间是 O ( 1 ) O(1) O(1),总时间复杂度是 O ( n ) O(n) O(n)。
代码
class Solution {public int[] runningSum(int[] nums) {int length = nums.length;int[] sums = new int[length];sums[0] = nums[0];for (int i = 1; i < length; i++) {sums[i] = sums[i - 1] + nums[i];}return sums;}
}
复杂度分析
-
时间复杂度: O ( n ) O(n) O(n),其中 n n n 是数组 nums \textit{nums} nums 的长度。计算每个元素的动态和的时间是 O ( 1 ) O(1) O(1),时间复杂度是 O ( n ) O(n) O(n)。
-
空间复杂度: O ( 1 ) O(1) O(1)。注意返回值不计入空间复杂度。