我必须编写一个函数,它接受一个整数列表并返回列表的最大和子列表。一个例子是:
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
我有点困惑和困惑,有人可以帮忙吗? 谢谢!
答案 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增长,并带有一些任意系数。
一些改进的启发式方法:
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);
}