leetcode第303题,实现一个由下标求和的程序。
这个问题看上去很简单,但是关键是怎么优化,如果直接写也可以ac,但是时间效率上回很低。
class NumArray(object):
def __init__(self, nums):
"""
initialize your data structure here.
:type nums: List[int]
"""
self.nums = nums
def sumRange(self, i, j):
"""
sum of elements nums[i..j], inclusive.
:type i: int
:type j: int
:rtype: int
"""
return sum(self.nums[i:j+1])
# Your NumArray object will be instantiated and called as such:
# numArray = NumArray(nums)
# numArray.sumRange(0, 1)
# numArray.sumRange(1, 2)
另一种办法是,在构建类的时候,实现做下处理,由于题目中要求会多次调用加和函数,因此时间应该主要浪费在这里了,可以事先做好一个加和的数组,这样可以把复杂度降到常数级,这个思路和opencv中的haar级联分类器的优化方法积分图很相似,都是运用了建表实现的。
class NumArray(object):
def __init__(self, nums):
"""
initialize your data structure here.
:type nums: List[int]
"""
self.nums = list(nums)
for i in range(1,len(nums)):
nums[i] += nums[i-1]
self.numsSum = nums
def sumRange(self, i, j):
"""
sum of elements nums[i..j], inclusive.
:type i: int
:type j: int
:rtype: int
"""
return self.numsSum[j]-self.numsSum[i]+self.nums[i]