Python 如何优化此代码以减少执行时间?

Python 如何优化此代码以减少执行时间?,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个数组中的元素-如果该元素存

问题就在这里:

由于超时,我收到一个终止错误! 请帮帮我。

算法说明:

第一步。

获取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个数组中。 因此答案是5

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])。两者都会起作用。