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.
解题
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 的前缀数组