一维数组的动态和

标签: 数组 前缀和

难度: 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

Submission

运行时间: 23 ms

内存: 16.2 MB

class Solution:
    def runningSum(self, nums: List[int]) -> List[int]:
        s = 0
        ans = []
        for num in nums:
            s += num
            ans.append(s)

        return ans

Explain

该题解采用了累加的方式来计算数组的动态和。具体地,初始化一个变量 s 用来存储累加的和,并且对输入数组 nums 进行遍历,每遍历一个元素,就将其加到 s 上,并把当前的 s 值添加到结果数组 ans 中。这样,遍历完成后,ans 数组就记录了从数组第一个元素到当前元素的所有元素之和。

时间复杂度: O(n)

空间复杂度: O(n)

class Solution:
    def runningSum(self, nums: List[int]) -> List[int]:
        s = 0  # 初始化累加变量
        ans = []  # 初始化结果数组
        for num in nums:  # 遍历输入数组
            s += num  # 累加当前元素到s
            ans.append(s)  # 将当前的累加和添加到结果数组

        return ans  # 返回动态和数组

Explore

选择使用一个额外的数组`ans`来存储结果而不是直接修改原数组`nums`的主要原因是为了保持输入数据的不变性。这样做可以避免在后续的操作或调试中由于数据被更改而引发的潜在问题。此外,保持输入数组不变可以使函数更易于理解和维护,因为它遵循了无副作用的编程原则。这种设计选择有助于确保函数的纯粹性,使得同一输入总是得到相同的输出,不受外部状态的影响。

在使用Python列表的`append()`方法时,确实需要考虑内存重新分配的问题。列表在达到当前容量极限时会进行自动扩容,通常是通过分配一个更大的内存块来实现。这个过程中,旧元素会被复制到新的内存块中,这会造成一定的性能开销。尽管如此,由于Python的列表扩容策略通常是指数增长(例如,每次扩容增加50%的容量),所以平均来说,`append()`操作的时间复杂度是O(1)。这意味着尽管偶尔会有较大的性能代价,但在大多数情况下,性能是可接受的。

这种累加方法完全可以处理包含负数的数组`nums`。累加过程本质上是对数组中的每个元素进行顺序相加,无论元素是正数、负数还是零,都不影响累加操作的进行。需要注意的是,如果数组中包含负数,动态和的结果可能不是单调递增的,这与全部为正数的情况有所不同。此外,如果输入数组的元素非常大或非常小,还需要考虑数值溢出的问题,特别是在一些固定位数的数据类型中。在Python中,整数类型可以自动处理大数,但在其他语言中可能需要特别处理。