返回最大子列表的总和

时间:2013-02-25 02:14:01

标签: list python-3.x sum max minimum

我必须编写一个函数,它接受一个整数列表并返回列表的最大和子列表。一个例子是:

l = [4,-2,-8,5,-2,7,7,2,-6,5]

返回19

到目前为止我的代码是:

count = 0
for i in range(0,len(l)-1):
    for j in range(i,len(l)-1):
        if l[i] >= l[j]:

            count += l[i:j]

return count

我有点困惑和困惑,有人可以帮忙吗? 谢谢!

3 个答案:

答案 0 :(得分:0)

我认为这是一个家庭作业,所以我不会尝试谷歌算法和/或发布太多代码。

一些想法(只是从我的头脑中,'因为我喜欢这些任务: - ))

由于用户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

希望这会导致正确的方向。

答案 1 :(得分:0)

这称为“最大子阵列问题”,可以在线性时间内完成。 wikipedia article有你的答案。

答案 2 :(得分:0)

最优解决方案是采用线性运行时O(n)。但是这个问题有“n * lgn”运行时解决方案(基于分而治之算法)和“n ^ 2”运行时解决方案。如果你是对这些算法感兴趣的是链接introduction to algorithms,强烈建议这里使用 java 编写一个具有线性运行时的代码。

public static void main(String[] args) {
    // TODO Auto-generated method stub
    Scanner sc=new Scanner(System.in);
    int n=sc.nextInt();
    int []A=new int[n];
    int highestsum=Integer.MIN_VALUE;
    int sumvariable=0;
    int x=0;
    for(int i=0;i<n;i++)
    {
        A[i]=sc.nextInt();
    }
    for(int i=0;i<n;i++)
    {
        sumvariable+=A[i];
        if(sumvariable<0)
        {
            if(sumvariable>=highestsum)
            {
                highestsum=A[i];
                sumvariable=A[i];
            }
            else
            {
                sumvariable=0;
            }
        }
        else
        {
            if(sumvariable>highestsum)
            {
                highestsum=sumvariable;
            }

        }
    }
    System.out.println(highestsum);
}