解决之路= =
题目描述
测试案例(部分)
第一次
emmm,说实话,一开始我还真没看懂题目是什么意思。。。。
自己按我自己理解的方式写了一下代码,用测试案例跑了下,成功了。
不过,放进去跑不通,报错也不是代码逻辑的问题,应该是LeetCode的测试代码和自己补充的两个函数冲突了。
再看看题目,我们好像不用干那么多事,只需要把每个函数的职责写好就行,不需要我们做后续的任务。。。所以我们试试。
class NumArray(object):
def __init__(self, nums):
self.nums = nums
def sumRange(self, left, right):
return sum(self.nums[left: right + 1])
# Your NumArray object will be instantiated and called as such:
# obj = NumArray(nums)
# param_1 = obj.sumRange(left,right)
测试正确,提交,通过了。
第二次
但就不知道怎么减少好费时间了,翻了翻评论区。除了有和自己一开始一样的,看不懂题目的,也看到和自己类似的代码答案。
不过,注意到了一个老哥指出的问题:题干一直强调sumRange()
需要重复调用。
所以,降低时间复杂度,就是要减少sumRange()
中耗费的时间。
那换个思路想想,减少sumRange()
的耗时,就是要把费时的东西都放在__init__()
里面干好。
那基于这个思路,我们改一下代码,要在__init__()
里面准备好可以让sumRange()
通过left
和right
快速得到结果的数据。这样的数据是什么样的呢?在这个老哥的评论中也有答案。
他的思路就是,从左到右,两两相加,这样得到的新序列nums
第i
项就是原来nums
前i
项和。这样,通过left和right就可以通过下标位置得到前left
项和,以及前right
项和,他们两相减,就得到了原来nums
中第left+1
项+…+第right
项。所以,self.nums[right] - self.nums[left - 1]
就是第left
项+…+第right
项的和。
class NumArray(object):
def __init__(self, nums):
self.nums = nums
for i in range(len(self.nums)):
if i > 0:
self.nums[i] = self.nums[i] + self.nums[i - 1]
def sumRange(self, left, right):
if left > 0:
return self.nums[right] - self.nums[left - 1]
else:
return self.nums[right]
测试正确,提交成功,确实降低了耗时。
结束。