分类:数组-前缀和数组
题目描述:
给定一个整数数组 nums,求出数组从索引 i 到 j(i ≤ j)范围内元素的总和,包含 i、j 两点。
实现 NumArray 类:
NumArray(int[] nums) 使用数组 nums 初始化对象
int sumRange(int i, int j) 返回数组 nums 从索引 i 到 j(i ≤ j)范围内元素的总和,包含 i、j 两点(也就是 sum(nums[i], nums[i + 1], ... , nums[j]))
解题思路:
要求一个区间范围内的数之和,如果采用现找现加的方式,将会导致复杂度跟求和范围紧密相关。
我们能做的更好的,就是让检索结果的时候,将其复杂度降为常量级,也就是单纯的数学计算。
所以我们可以先创建一个数组,用来存放从原数组每项累加的和,我们称其为前缀和数组。
这样,我们可以利用减法,直接得出结果,公式:sumRange(i,j)=sums[j+1]−sums[i]。
1 class NumArray: 2 3 def __init__(self, nums: List[int]): 4 self.sums=[0] 5 _sums = self.sums 6 7 for num in nums: 8 _sums.append(_sums[-1]+num) 9 10 11 def sumRange(self, left: int, right: int) -> int: 12 _sums=self.sums 13 return _sums[right+1]-_sums[left] 14 15 16 # Your NumArray object will be instantiated and called as such: 17 # obj = NumArray(nums) 18 # param_1 = obj.sumRange(left,right)
class NumArray: def __init__(self, nums: List[int]): N = len(nums) self.preSum = [0] * (N + 1) for i in range(N): self.preSum[i + 1] = self.preSum[i] + nums[i] def sumRange(self, i: int, j: int) -> int: return self.preSum[j + 1] - self.preSum[i]
- 时间复杂度:构造函数的时间复杂度是 O(N)O(N),
sumRange
函数调用的时间复杂度是 O(1) - 空间复杂度:O(N)