每日leetcode-数组-303. 区域和检索 - 数组不可变

分类:数组-前缀和数组

 

题目描述:

给定一个整数数组  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)

 

posted @ 2021-05-26 21:01  LLLLgR  阅读(44)  评论(0编辑  收藏  举报