Skip to content

303.range-sum-query-immutable

题目

Given an integer array nums, handle multiple queries of the following type:

Calculate the sum of the elements of nums between indices left and right inclusive where left <= right. Implement the NumArray class:

NumArray(int[] nums) Initializes the object with the integer array nums. int sumRange(int left, int right) Returns the sum of the elements of nums between indices left and right inclusive (i.e. nums[left] + nums[left + 1] + ... + nums[right]).

Example 1:

Input ["NumArray", "sumRange", "sumRange", "sumRange"] [[[-2, 0, 3, -5, 2, -1]], [0, 2], [2, 5], [0, 5]] Output [null, 1, -1, -3]

Explanation NumArray numArray = new NumArray([-2, 0, 3, -5, 2, -1]); numArray.sumRange(0, 2); // return (-2) + 0 + 3 = 1 numArray.sumRange(2, 5); // return 3 + (-5) + 2 + (-1) = -1 numArray.sumRange(0, 5); // return (-2) + 0 + 3 + (-5) + 2 + (-1) = -3

Constraints:

1 <= nums.length <= 104 -105 <= nums[i] <= 105 0 <= left <= right < nums.length At most 104 calls will be made to sumRange.

解题

python
class NumArray:

    def __init__(self, nums: List[int]):
        # 初始化数组,S[0] = 0,为了方便兼容空数组的情况, 故 S[n] n 为数组总长度
        # 总前缀和 S[-1] = S[len(nums)]
        # S 的 Index 为长度,而非当前索引

        self.s = [0] * (len(nums) + 1)
        for i, num in enumerate(nums):
            self.s[i + 1] = self.s[i] + num 
        

    def sumRange(self, left: int, right: int) -> int:
        # left 到 right 的区间 = 0 到 right区间 - 0 到 (left - 1) 的区间
        # 0 到 right 区间 = s[right + 1]
        # 0 到 left - 1 区间 = s[left]

        return self.s[right + 1] - self.s[left]
        


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

复杂度分析

  • 时间复杂度 初始化 O(N),后续检索复杂度 O(1)
  • 空间复杂度 O(N), 用于创建了 N + 1 的前缀数组