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