力扣(leetcode) 303. 区域和检索 - 数组不可变 (前缀和)

题目在这:

思路分析:

求i到j之间的元素之和。

这是一道前缀和的题目。 比如数组 [1,2,3] 则前缀和的数组 【1,3,6】 。前缀和数组第i个元素,为原数组的前i个数之和。 建立好前缀数组之后,直接从前缀数组返回即可。

完整代码

class NumArray:

    def __init__(self, nums: List[int]):
        n = len(nums)
        self.prenum = [0] * (n + 1)
        for i in range(n):
            self.prenum[i + 1] = self.prenum[i] + nums[i]
           
    def sumRange(self, left: int, right: int) -> int:
        return self.prenum[right + 1] - self.prenum[left]


# Your NumArray object will be instantiated and called as such:
# obj = NumArray(nums)
# param_1 = obj.sumRange(left,right)

这里一定要想清楚,建立的前缀和第0项为0,从第1项开始,为原数组的前1项和。 所以比如需要输出2到4之间的元素和, 则需要 原数组第2项、第3项、第4项的元素之和。则前缀和的第5项(原数组中第0项、第1项、第2项、第3项、第4项) 减去 前缀和第2项(原数组中第0项,第1项)。 显然,得到的是:原数组 第2项、第3项、第4项之和。

经验分享 程序员 微信小程序 职场和发展