我认为这是一个家庭作业,所以我不会在这里尝试谷歌算法和/或发布太多代码。
一些想法(只是从我的脑海中,因为我喜欢这些类型的任务:-))
正如用户 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
例如示例末尾的 。
希望这会导致正确的方向。