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

时间:2019-08-06 15:09:14

标签: python algorithm stack

问题在这里:

https://www.hackerrank.com/challenges/equal-stacks/problem

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

算法说明:

  

第一步。

获取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]

  

步骤III。

采用最小的数组,即[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)

我收到超时错误。...请帮助我优化此代码。

3 个答案:

答案 0 :(得分:0)

使用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

答案 1 :(得分:0)

如果堆栈的高度不同,则至少至少一个比最高的堆栈短。最矮的一个不能做得更高,所以最高的一个必须做得更矮。

从最高的堆栈上弹出一个项目。

重复直到它们都达到相同的高度。

答案 2 :(得分:0)

简单的解决方案。

如果您听不懂,请ping我。

这里只是简单地应用贪婪方法从堆栈中一一移除最小高度的圆柱体,直到我们得到最大相等的高度。

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