问题在这里:
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)
我收到超时错误。...请帮助我优化此代码。
答案 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