题目:
给定一个整数数组 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
运行通过:

可以看到耗时大大减少了^-^
文章介绍了如何在NumArray类中实现高效的元素和查询,通过预计算前缀和,将sumRange方法的时间复杂度从O(n)降低到O(1),显著减少查询耗时。
2205

被折叠的 条评论
为什么被折叠?



