[英]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.