【问题标题】:How to overcome Time Limit Exceeded in Python如何克服 Python 中超出的时间限制
【发布时间】:2021-10-30 22:12:54
【问题描述】:

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

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

约束

1

-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 ,当它们相等时返回当前位置

谢谢

【问题讨论】:

    标签: python performance


    【解决方案1】:

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

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

    【讨论】:

    • 无需存储总和;只是: - 计算数组的总和。继续从 0 开始运行 sum,然后: - 对于每个元素:如果 (totsum-current) == (runsum),则返回当前;否则:totsum -= 当前,runsum += 当前
    • 确实,好策略!它在内存中是O(1),但仍然需要两次步行;)。更好的方法是同时计算两边的部分和,以便找到中间。为此,必须在每个迭代步骤中递增最小部分和。当它们相等且两者之间的差距为 1 项时,则找到枢轴。
    • 您能否进一步解释您的评论?我看不出它是如何工作的,尤其是在 [1, 1, 1, 1, 1, 1, 1, ..., 1000] 等边缘情况下
    • @Tordek 您能否详细说明您的解决方案?我已经尝试实现它,但我无法让它工作。
    • ideone.com/iq0nu7 @rangeseeker(这会返回值的索引,根据问题中的要求,但这是伪代码解释的一个微不足道的变化)
    【解决方案2】:

    试试这个:

    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
    

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

    【讨论】:

    • 这遇到了与 OP 自己的答案相同的问题。
    猜你喜欢
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多