【发布时间】:2020-12-27 21:01:55
【问题描述】:
我正在练习一些亚马逊面试编码练习,但我一直坚持这个练习。
简而言之,给定一个列表l 和一个整数d,我必须将列表拆分为d 个部分,使得每个部分的最大值之和最小,例如l = [10,2,20,5,15,10,1], d = 3应该返回 31,因为最好的选择是 [10,2,20,5,15],[10],[1] -> 20+10+1 = 31。
问题链接:Problem
我考虑将列表拆分为 2 并使用第一部分和d-1 递归调用,并取第二部分的最大值(第二部分将开始有一个元素,我们将在此部分中添加一个元素每次迭代)。
我这样做了,但出现“调用 Python 对象时超出最大递归深度”错误。我知道这个问题的解决方案很容易找到,但我想了解为什么这种方法不起作用。
def getmin(l, d):
# base case, if the list has d elements each element will be a sublist
if len(l)==d:
return sum(l)
else:
minn = float("inf")
for i in range(1, len(l)-d+1):
val = getmin(l[0:-i], d-1) + max(l[-i:])
if minn > val:
minn = val
return minn
【问题讨论】:
-
尝试在函数顶部打印
l和d。我很确定他们没有做你期望的事情。您可能会重载l作为可能的结果和输入列表。您需要一个单独的结果结构。
标签: python algorithm dynamic-programming