Python 如何优化此代码以减少执行时间?
问题就在这里: 由于超时,我收到一个终止错误! 请帮帮我。 算法说明: 第一步。 获取3个数组并反转它们,从现有数组中创建一个新数组,每个元素都是之前所有元素的总和。例如:[3,2,1,1,1]->[1,1,1,2,3]->[1,2,3,5,8] 因此形成的3个新阵列将是[1,2,3,5,8][2,5,9][1,5,6,7] 第二步。 再次反转数组[8,5,3,2,1][9,5,2][7,6,5,1] 第三步。 取最小的数组,即[9,5,2]遍历最小数组并搜索其他2个数组中的元素-如果该元素存在于其他2个数组中,请在此处停止并返回数字。 这里我从elem-9开始:它在其他2个数组中不存在。接下来我从elem-5开始:它存在于其他2个数组中。 因此答案是5Python 如何优化此代码以减少执行时间?,python,algorithm,stack,Python,Algorithm,Stack,问题就在这里: 由于超时,我收到一个终止错误! 请帮帮我。 算法说明: 第一步。 获取3个数组并反转它们,从现有数组中创建一个新数组,每个元素都是之前所有元素的总和。例如:[3,2,1,1,1]->[1,1,1,2,3]->[1,2,3,5,8] 因此形成的3个新阵列将是[1,2,3,5,8][2,5,9][1,5,6,7] 第二步。 再次反转数组[8,5,3,2,1][9,5,2][7,6,5,1] 第三步。 取最小的数组,即[9,5,2]遍历最小数组并搜索其他2个数组中的元素-如果该元素存
import os
import sys
def equalStacks(h1, h2, h3):
new_h1=[]
new_h2=[]
new_h3=[]
h1=list(reversed(h1))
h2=list(reversed(h2))
h3=list(reversed(h3))
new_h1.append(h1[0])
new_h2.append(h2[0])
new_h3.append(h3[0])
bol=False
ans=-1
for i in range(len(h1)-1):
new_h1.append(new_h1[i]+h1[i+1])
for i in range(len(h2)-1):
new_h2.append(new_h2[i]+h2[i+1])
for i in range(len(h3)-1):
new_h3.append(new_h3[i]+h3[i+1])
low=min([n1,n2,n3])
if low==n1:
for i in list(reversed(new_h1)):
if (i in list(reversed(new_h2))) and (i in list(reversed(new_h3))):
bol=True
ans=i
break
else:
pass
elif low==n2:
for i in list(reversed(new_h2)):
if (i in list(reversed(new_h1))) and (i in list(reversed(new_h3))):
bol=True
ans=i
break
else:
pass
else:
for i in list(reversed(new_h2)):
if (i in list(reversed(new_h1))) and (i in list(reversed(new_h3))):
bol=True
ans=i
break
else:
pass
if bol==True:
return(print(i))
else:
return(print(0))
if __name__ == '__main__':
n1N2N3 = input().split()
n1 = int(n1N2N3[0])
n2 = int(n1N2N3[1])
n3 = int(n1N2N3[2])
h1 = list(map(int, input().rstrip().split()))
h2 = list(map(int, input().rstrip().split()))
h3 = list(map(int, input().rstrip().split()))
result = equalStacks(h1, h2, h3)
我遇到超时错误…请帮助我优化此代码。使用
itertools
的一个可能的解决方案:
data = '''
3 2 1 1 1
4 3 2
1 1 4 1
'''
from itertools import accumulate, chain, groupby
# prepare the data
data = [[*map(int, line.split())] for line in data.splitlines() if line.strip()]
max_height = 0
for v, g in groupby( sorted(chain(*[accumulate(stack[::-1]) for stack in data]), reverse=True) ):
if sum(1 for _ in g) == 3:
max_height = v
break
print(max_height)
印刷品:
5
如果堆叠的高度不同,那么至少有一个比最高的要短。最短的不能再高了,所以最高的必须再短一些 从最高的堆栈中弹出一个项目 重复上述步骤,直到它们高度相同。简单解决方案 如果你不能理解,请打电话给我 这里简单地应用贪心方法从堆栈中逐个移除最小高度圆柱体,直到获得最大等高
def equalStacks(h1, h2, h3):
h1.reverse()
h2.reverse()
h3.reverse()
i = sum(h1)
j = sum(h2)
k = sum(h3)
while i != 0 or j !=0 or k!= 0:
x = min(i,j,k)
if i > x:
i -= h1.pop()
if j > x :
j -= h2.pop()
if k > x:
k -= h3.pop()
if i == j and j == k:
return i
return 0
提示:答案(5)出现在步骤1中创建的所有三个列表中,即其计数为3。是的,起初我甚至想到了这个解决方案,但无法有效地将其编码出来,并最终导致所有情况下的超时错误。我不认为h1.reverse()方法会起作用。它没有输出!如果您使用的是Python3.x,它就可以工作了。您还可以直接使用h1_new=list(h1[:-1])。两者都会起作用。