繁体   English   中英

如何克服 Python 中超出的时间限制

[英]How to overcome Time Limit Exceeded in Python

我正在做这个练习Find Pivot Index ,我花了很长时间才完成,通过了示例案例,但在提交时收到了 Time Limit Exceeded 错误,这令人沮丧

我想知道如何预先计算/估计约束以避免 TLE? 我觉得这一定与给定的约束有关,但我不认为我完全理解这些意味着什么。

约束

1 <= nums.length <= 104

-1000 <= nums[i] <= 1000

class Solution:
    def pivotIndex(self, nums: List[int]) -> int:
        cur = 0
        l = 0
        r = 1
        rightSum = 0
        leftSum = 0
        n = len(nums);
       
        while cur < n:
            rightSum=0
            leftSum=0
            r=cur+1
            while r <n:
                rightSum+=nums[r]
                r+=1;
            l=0
            while l< cur:
                leftSum+=nums[l]
                l+=1
            r+=1
            if leftSum ==rightSum:
                return cur;
            cur+=1

        return -1 ;
        

我使用了一种直观的方法来比较 leftSum 和 rightSum ,当它们相等时返回当前位置在此处输入图片说明

谢谢

您的算法的问题在于它以二次时间运行(即O(n**2) ,其中n是输入数组的大小),而它可以以线性时间运行(即O(n) )。 关键是您要多次重新计算正确部分的总和。 这效率不高,因为您只需要计算一次。 您可以将累积总和存储在另一个数组中,以便以后不再重新计算(并在恒定时间内获得正确的总和)。 例如,您可以在开始时预先计算它,或者在需要时根据先前计算的总和进行迭代计算(请参阅动态规划)。 请注意,您可以使用Numpy函数numpy.cumsum轻松高效地计算累积总和。

实际上,更简单的算法是从左到右以相反的顺序计算累积和,并将它们存储在两个不同的数组中。 然后,您可以通过从 0 到 n 的锁步迭代两个数组来轻松找到答案,以检查左侧部分是否等于右侧部分(不包括当前项目)。

尝试这个:

def pivotIndex(self, nums: List[int]) -> int:
    for index in range(0, len(nums)):
        if sum(nums[:index]) == sum(nums[index + 1:]):
            return index
    return -1

我能得到的最好的,虽然不是很快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM