簡體   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