题目:
给定一个整数数组 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
'方法,用循环计算left到right之间的元素和。代码如下:
class NumArray(object):
def __init__(self, nums):
"""
:type nums: List[int]
"""
self.nums = nums
def sumRange(self, left, right):
"""
:type left: int
:type right: int
:rtype: int
"""
sum = 0
for x in range(left, right+1):
sum += self.nums[x]
return sum
运行通过:
可以看到,用时太长了, 原因是'sumRange
'方法的时间复杂度为O(n),调用
'sumRange
'方法的次数越多,耗时就显著增长。要减少耗时,就要尽量简化
'sumRange
'方法。
解法二
对于left到right之间的元素和有如下公式:
那么可以在初始化方法中,用一个列表记录数组nums的每个下标的前缀和,然后在'sumRange'方法中只需要用上述公式计算,就能直接得出left到right之间的元素和,使得'sumRange'方法的时间复杂度仅为O(1),在多次调用'sumRange'方法的情况下大大减少耗时。
代码如下:
class NumArray(object):
def __init__(self, nums):
"""
:type nums: List[int]
"""
self.sums = [0]
n = len(nums)
for i in range(0, n):
self.sums.append(nums[i]+self.sums[i])
def sumRange(self, left, right):
"""
:type left: int
:type right: int
:rtype: int
"""
result = self.sums[right+1] - self.sums[left]
return result
运行通过:
可以看到耗时大大减少了^-^