我认为这是一个家庭作业,所以我不会尝试谷歌算法在这里和/或张贴太多的代码。
的一些想法(只是从我的头顶,因为我喜欢这些类型的任务:-))
随着用户LC已经指出的天真,也详尽的方法是测试每一个子表。我相信你的(user2101463)代码会朝着这个方向发展。只需使用sum()
来构建总和并与已知最好的比较。要使用合理的起始值来填充最好的已知总和,只需使用列表的第一个值即可。
the_list = [4,-2,-8,5,-2,7,7,2,-6,5]
best_value = the_list[0]
best_idx = (0,0)
for start_element in range(0, len(the_list)+1):
for stop_element in range(start_element+1, len(the_list)+1):
sum_sublist = sum(the_list[start_element:stop_element])
if sum_sublist > best_value:
best_value = sum_sublist
best_idx = (start_element, stop_element)
print("sum(list([{}:{}])) yields the biggest sum of {}".format(best_idx[0], best_idx[1], best_value))
这当然有二次运行时O(N^2)。这意味着:如果由输入列表的元素数量定义的问题大小随N增长,则运行时随N * N增长,并带有一些任意系数。
一些技巧的改进:因为他们降低实现的总和
如果遇到负数的序列
- 显然负数并不好,重新启动您的最佳子列表该序列后,如果总和到目前为止的最佳列表加上负数是< 0.在您的示例列表中,前三个数字不能成为最佳列表的一部分,因为
4
的积极效果总是被-2, -8
否定。
- 可能这甚至会导致一个
O(N)
的实现,它只是从头到尾迭代,记住最有名的起始索引,同时计算从该起始索引开始的全部总和的运行总和以及最后一个连续序列的正和负小计正数和负数。
- 一旦这样一个最好的列表中找到,这可能需要一个最终清理删除尾随负子列表诸如
-6, 5
在你的例子结束。
希望这会导致在正确的方向。
来源
2013-02-25 14:13:55
cfi
幼稚的做法是检查所有长度为1..'len(l)'的所有可能子列表。也就是说,您需要检查每个子列表长度1,然后检查每个子列表长度2,然后检查每个子列表长度3,并输出找到的最大值。 – 2013-02-25 02:16:13
[Maximum sum sublist?]的可能重复(http://stackoverflow.com/questions/15062844/maximum-sum-sublist) – Dukeling 2014-06-13 06:35:18