打卡第二天,还是LeetCode每日一题的题目。
题目描述
LeetCode地址:区域和检索-数组不可变
这个题目,我在没有看答案之前反复看了多遍题目和测试用例,楞是没有看懂。最后迫不得已直接看了答案才有点明白了。
本题的核心其实就是在于求出给定i到j范围内所有数字的和,但是由于需要多次调用sumRange函数求和,如果每次都吧数组初始化一次,那么就会很耗费时间。因此我们需要考虑在创建对象的时候先初始化一个sum数组,这个sum数组保存了前n个数组元素的和。有了这个sum数组之后,我们求i到j的元素和的时候,直接用sum[j+1]-sum[i]就得到了结果,就不用每次都初始化一遍num数组。
因此,本题的核心在于要多次调用时提高效率。下面来看一下官方给出的解法。
解法
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(i,j)
代码其实很简单,初始化一个_sums数组存放前n项和,每次计算调用这个数组就可以了。
另外在评论区看到了其他一些人的解法,感觉也挺有意思:
class NumArray:
def __init__(self, nums: List[int]):
self.nums = nums
def sumRange(self, i: int, j: int) -> int:
return sum(self.nums[i:j+1])
这里用了python的内置sum函数。感觉有点投机取巧的意思了😅,不过代码是真的简单。