题目描述:
给定一个整数数组 nums,处理以下类型的多个查询:
计算索引 left 和 right (包含 left 和 right)之间的 nums 元素的 和 ,其中 left <= right
实现 NumArray 类:
NumArray(int[] nums) 使用数组 nums 初始化对象
int sumRange(int i, int j) 返回数组 nums 中索引 left 和 right 之间的元素的 总和 ,包含 left 和 right 两点(也就是 nums[left] + nums[left + 1] + … + nums[right] )
解题思路:
要求一个区间范围内的数之和,如果采用现找现加的方式,将会导致复杂度跟求和范围紧密相关。
我们能做的更好的,就是让检索结果的时候,将其复杂度降为常量级,也就是单纯的数学计算。
所以我们可以先创建一个数组,用来存放从原数组每项累加的和,我们称其为前缀和数组。
这样,我们可以利用减法,直接得出结果,公式:sumRange(i,j)=sums[j+1]−sums[i]。
代码演示:
class NumArray:
def __init__(self, nums: List[int]):
self.sums = [0]
_sums = self.sums
for num in nums:
_sums.append(_sums[-1] + num)
def sumRange(self, i: int, j: int) -> int:
_sums = self.sums
return _sums[j + 1] - _sums[i]
# Your NumArray object will be instantiated and called as such:
# obj = NumArray(nums)
# param_1 = obj.sumRange(left,right)