【发布时间】:2016-04-13 07:39:58
【问题描述】:
每当我给数组的size 多于3 时,我的程序都会给我StackOverflowError。
package database;
import java.util.Scanner;
public class The_Maximum_Subarray {
int a[];
public The_Maximum_Subarray(int size) {
a=new int[size];
}
public int maxsubArray(int[] a,int li,int ui)
{
if(ui ==li)
return a[li];
int m=(ui-li)/2;
int leftMaxSubarray=maxsubArray(a, li, m);
int rightMaxSubarray=maxsubArray(a, m+1, ui);
int leftSum=0,rightSum=0,sum=0;
for(int i=m;i>=li;i--)
{
sum+=a[i];
if(sum>leftSum)
leftSum=sum;
}
sum=0;
for(int i=m+1;i<=ui;i++)
{
sum+=a[i];
if(sum>rightSum)
rightSum=sum;
}
sum=leftSum+rightSum;
if(rightMaxSubarray>=leftMaxSubarray && rightMaxSubarray>=sum)
return rightSum;
else if(leftMaxSubarray>=rightMaxSubarray && leftMaxSubarray>=sum)
return leftSum;
else
return sum;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int size=sc.nextInt();
The_Maximum_Subarray obj=new The_Maximum_Subarray(size);
for(int j=0;j<size;j++)
obj.a[j]=sc.nextInt();
System.out.println(obj.maxsubArray(obj.a, 0, size-1));
}
}
谁能告诉我为什么它给我这个小尺寸数组的例外?
【问题讨论】:
-
因为你有一个无限深的递归,所以设置一个断点并调试你的代码,逐行遍历
maxsubArray。 -
看看this
-
您似乎正在使用递归和循环的组合。此外,如果您从一个包含给定点的所有总和的数组开始并找到两个值之间的最大差值,则可以更有效地执行此操作。
-
顺便说一句,您可以在单遍循环中执行此操作而无需递归。我会考虑如何简化这一点。这似乎不是基于快速排序或合并排序。
-
感谢您的回复,这实际上是 kadanes algo..我的代码中的错误在 'int m=(ui-li)/2;' 行中它应该是 'int m=(ui-li)/2+li;'
标签: java arrays stack-overflow