魔术方法和求和
方法一:暴力循环
哈哈这也是我做的方法,用时很长,内存消耗也是中等偏后的位置。但是肯定是最先想到的。
class NumArray(object):
def __init__(self, nums):
"""
:type nums: List[int]
"""
self.nums=nums #这里需要定义
def sumRange(self, i, j):
"""
:type i: int
:type j: int
:rtype: int
"""
sum=0 #最基本的循环求和
for m in range(i,j+1):
sum=sum+self.nums[m]
return sum
这道题真正让我迷惑了一会的是魔法函数,我只大概看了一点知乎上这个非常长的文章(内容非常全),我感觉就是用python实现在C++中的类。我照猫画虎试着写的。这么写吧,好处就是非常好理解,缺点就是特别耗时、空。
T(n)=O(n*m)#调用几回我就得算几回
S(n)=O(n)
方法二:动态规划法
让我们一起品鉴一下168ms的作品:
class NumArray(object):
def __init__(self, nums):
"""
:type nums: List[int]
动态规划法
"""
if not nums:
self.arr = []
return
self.arr = nums
self.arr[0] = nums[0]
for i in range(1, len(nums)): #循环len(nums)次
self.arr[i] = self.arr[i - 1] + nums[i] #在self.arr[i]里存好了从0号位置到i位置的和
def sumRange(self, i, j):
"""
:type i: int
:type j: int
:rtype: int
"""
if not self.arr:
return 0
if i == 0:
return self.arr[j]
if i <= j:
return self.arr[j] - self.arr[i - 1]
return 0
#方便大家test
#numArray = NumArray([-2, 0, 3, -5, 2, -1])
#print(numArray.sumRange(0, 2))
#print(numArray.sumRange(2, 5))
#print(numArray.sumRange(0, 5))
Tn=O(n)
S(n)=O(n)
我又去确认了一下,确实内存消耗是差不多的。但是我的做法用时4532ms。