leetcode区域和检索-数组不可变

魔术方法和求和

题目要求以及示例

方法一:暴力循环

哈哈这也是我做的方法,用时很长,内存消耗也是中等偏后的位置。但是肯定是最先想到的。

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值