题目大意
输入一个数组,给定两个数组的索引i和j(i <= j),计算从索引i到j的和。
原题链接:303. Range Sum Query - Immutable
题解
一开始的时候我打算在初始化的时候用一个二维数组存储所有结果值,然后每次获取和的时候直接访问缓存的二维数组即可。
理想很美好,现实很扑街,惨遭MLE。
class NumArray(object):
def __init__(self, nums):
array_length = len(nums)
self._look_up = [[None] * array_length for i in range(array_length)]
# initialize first element
for i in range(array_length):
self._look_up[i][i] = nums[i]
for row in range(array_length):
for col in range(row + 1, array_length):
self._look_up[row][col] = self._look_up[row][col - 1] + nums[col]
def sumRange(self, i, j):
return self._look_up[i][j]
在上面的代码中初始化的时候有一半的元素是没有用的,都为None,于是我调整了索引之间的计算关系,然而并没有什么卵用,惨遭TLE。
class NumArray(object):
def __init__(self, nums):
"""
:param nums:
本来self._look_up是这样子的
self._look_up = [[None] * array_length for i in range(array_length)]
但是有一半是None,浪费的内存太多了,结果导致MLE
根据计算关系优化吧
"""
array_length = len(nums)
self._look_up = [[None] * (array_length - i) for i in range(array_length)]
# initialize first element
for i in range(array_length):
self._look_up[i][0] = nums[i]
for row in range(array_length):
for col in range(1, array_length - row):
self._look_up[row][col] = self._look_up[row][col - 1] + nums[row + col]
def sumRange(self, i, j):
return self._look_up[i][j - i]
最后使用一维数组存储计算结果,每次取结果的时候通过减法完成计算。
class NumArray(object):
def __init__(self, nums):
"""
:param nums:
不一定是求一个二维数组,一位数组也可以,计算的时候用减法就可以了
"""
array_length = len(nums)
self._look_up = [None] * array_length
if array_length != 0:
self._look_up[0] = nums[0]
for i in range(1, array_length):
self._look_up[i] = self._look_up[i - 1] + nums[i]
def sumRange(self, i, j):
if i == 0:
return self._look_up[j]
else:
return self._look_up[j] - self._look_up[i - 1]