您的位置:首页 > 其它

最大子数组--线性非递归实现

2017-11-08 13:21 363 查看
public MaxRange MaxRangeSonArray(int[] array){
int maxStart=0,maxEnd=0;
int sumMax=array[0];
for (int i=1;i<array.length;i++){
int sum=sumMax;

for (int k=maxEnd+1;k<=i;k++){
sum+=array[k];
}
if (sum>sumMax){
sumMax=sum;
maxEnd=i;
}
sum=0;
int rightToLeft=maxStart;
for (int j=i;j>=maxStart;j--){
sum+=array[j];
if (sum>sumMax){
maxEnd=i;
rightToLeft=j;
sumMax=sum;
}
}
maxStart=rightToLeft;
}
return new MaxRange(sumMax,maxStart,maxEnd);
}


class MaxRange{
int start;
int end;
int sum;

public MaxRange(int max, int maxLeftIndex, int maxRightIndex) {
this.start=maxLeftIndex;
this.end=maxRightIndex;
this.sum=max;
}
}


public static void main(String[] args) {
Suanfa1 s= new Suanfa1();
Random random=new Random();
int array[]=new int[8];
for (int i=0;i<array.length;i++){
int rand=random.nextInt(1000);
rand=random.nextInt(2)==0?rand*-1:rand;
array[i]=rand;
}
for (int a:array){
System.out.print(a+"__");
}
System.out.println("------------");
MaxRange maxRange=s.findMaxMumSubArray(array,0,array.length-1);//递归实现
MaxRange maxRange1=s.MaxRangeSonArray(array);//非递归实现
for (int i=maxRange.start;i<=maxRange.end;i++){
System.out.print(array[i]+"__");
}
System.out.println();
for (int i=maxRange1.start;i<=maxRange1.end;i++){
System.out.print(array[i]+"__");
}
}

运行结果:
-65__-881__565__-871__131__-686__-581__79__------------

565__
565__

-58__926__339__-611__-599__194__986__453__------------

926__339__-611__-599__194__986__453__
926__339__-611__-599__194__986__453__

364,680,-228,612,760,-855,-482,135,------------

364,680,-228,612,760,
364,680,-228,612,760,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: