【问题标题】:How to optimize this code to reduce execution time?如何优化此代码以减少执行时间?
【发布时间】:2019-12-14 04:27:09
【问题描述】:

问题来了:

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]

第三步。

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

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

【问题讨论】:

  • 提示:答案 (5) 出现在步骤 1 中创建的所有三个列表中,即其计数为 3。

标签: python algorithm stack


【解决方案1】:

简单的解决方案。

如果你听不懂,请联系我。

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

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   

【讨论】:

  • 我不认为 h1.reverse() 方法会起作用。它输出 NONE!
  • 如果您使用的是 python 3.x,它将工作。您也可以直接使用 h1_new = list ( h1[ : :-1])。两者都可以。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    如果堆栈的高度不同,则至少有一个比最高的一个短。最短的不能变高,所以必须把最高的变短。

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

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

    【讨论】:

    • 是的,即使我一开始也想到了这个解决方案,但无法有效地编写出来,最终在所有情况下都出现超时错误。
    猜你喜欢
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    相关资源
    最近更新 更多