标题:Java中最大子序列求和
一、分析
1)方式一
* 方式一:取每一个正数,
* 遍历i后面所有的数,求和,发现有最大的就保存
2)方式二
找到一个正数 ,给max,及其索引赋初值
移动j,temp+=arr[j],判读temp的值,若大于0保存找到的现有的最大的值,继续移动j,若小于0,则temp减去arr[i]后,移动i
/**
* 最大子序列求和
* @author dell
*
*/
public class TestMaxNumbers {
/**
* 方式一:取每一个正数,
* 遍历i后面所有的数,求和,发现有最大的就保存0.069
*/
@Test
public void test01() {
// int[] arr=new int[] {-2,11,-4,13,-5,-2};
int[] arr=new int[] {100,-20,11,-4,13,-5,-2};
int max=arr[0];
int index0=0;
int index1=0;
int temp=0;
//遍历数组arr中的每一个正数
for(int i=0;i<arr.length;i++) {
if(arr[i]<0) {
continue;
}
temp=arr[i];
if(temp>max) {
max=temp;
index0=i;
index1=i;
}
//遍历每一个正数后面的所有数,求和,若此过程中发现有temp>max则改变max,及其索引
for(int j=i+1;j<arr.length;j++) {
temp+=arr[j];
if(temp>max) {
max=temp;
index0=i;
index1=j;
}
}
}
System.out.println("max:"+max+" index0:"+index0+" index1:"+index1);
}
/**
* 方式二:取每一个正数,0.018
*
*
*/
@Test
public void test02() {
// int[] arr=new int[] {-2,11,-4,13,-5,-2};
int[] arr=new int[] {100,-20,11,-4,13,-5,-2};
int max=0;
int index0=0;
int index1=0;
int temp=0;
//找到一个正数 ,给max,及其索引赋初值
for(int i=0;i<arr.length;i++) {
if(arr[i]>0) {
max=arr[i];
index0=i;
index1=i;
temp=arr[i];
break;
}
}
int i=index0;
int j=i+1;
//移动j,temp+=arr[j],判读temp的值,若大于0保存找到的现有的最大的值,继续移动j,若小于0,则temp减去arr[i]后,移动i
while(j<arr.length) {
temp+=arr[j];
if(temp>0) {
if(temp>max) {
max=temp;
index0=i;
index1=j;
}
j++;
}
while(temp<=0) {
temp-=arr[i];
i++;
}
}
System.out.println("max:"+max+" index0:"+index0+" index1:"+index1);
}
}