【每日一题】【LeetCode】【第十二天】【Python】区域和检索 - 数组不可变

文章讲述了在解决LeetCode问题时,初次尝试通过常规方法实现sumRange功能,但在实际运行中遇到时间效率问题。作者通过分析发现需要优化sumRange的调用,将计算工作前置到初始化阶段,通过预处理数据降低函数执行时的计算量,最终实现时间复杂度的降低并成功通过测试。
摘要由CSDN通过智能技术生成

解决之路= =

题目描述

在这里插入图片描述

测试案例(部分)

在这里插入图片描述

第一次

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()通过leftright快速得到结果的数据。这样的数据是什么样的呢?在这个老哥的评论中也有答案。

在这里插入图片描述

他的思路就是,从左到右,两两相加,这样得到的新序列numsi项就是原来numsi项和。这样,通过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]

测试正确,提交成功,确实降低了耗时。

在这里插入图片描述

结束。

附件

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值