题目描述
Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive.
示例如下:
Given nums = [-2, 0, 3, -5, 2, -1]
sumRange(0, 2) -> 1
sumRange(2, 5) -> -1
sumRange(0, 5) -> -3
给定一个整数序列,求指定子序列[i, j]的和sumRange(i, j)。
注:给定一个nums,会调用很多次sumRange(i, j)
解题思路
1、用空间换时间
不是在进行查询的时候累计求和,而是根据给定的nums在调用sumRange(i, j)之前将所有可能的结果计算出来,调用sumRange(i, j)时直接查找结果返回,代码如下:
class NumArray:
def __init__(self, nums):
length = len(nums)
'''
根据实际情况(j>=i) 使用字典数据结构,将会比二维数组节省一半的空间
'''
self.matrix = {}
for i in range(length):
self.matrix[str(i)+str(i)]= nums[i]
for i in range(length):
for j in range(i+1,length):
self.matrix[str(i)+str(j)] = self.matrix[str(i)+str(j-1)] + nums[j]
def sumRange(self, i, j) :
return self.matrix[str(i)+str(j)]
时间复杂度: 初始化O(n*n) + 查询O(1)
空间复杂度:n*n/2
提交,报错 -_-! Memory Limit Exceeded
空间优化的办法不多了,只能重新整理思路!
2、sumRange(i, j) = sumRange(0, j) – sumRange(i-1, j)
利用加法的结合律,得到从0到当前位置的累加值,查询时,利用上式进行计算,得到sumRange(i, j) ,代码如下:
class NumArray:
def __init__(self, nums):
self.nums = nums
for i in range(1, len(nums)):
self.nums[i] += nums[i-1]
def sumRange(self, i, j) :
if i==0 : return self.nums[j]
return self.nums[j] - self.nums[i-1]
时间复杂度: 初始化O(n) + 查询O(2)
空间复杂度:n
提交,通过。 ^_^ 收工