对于给定的一串数组,找到它的最大子序列,起始和终止的下标,并求出最大值。
解决方法思路:可以从数组的最后一个字符开始比较,初始的max等于最后一个数组值,然后从后往前加,这个值称为maxend,当maxend小于0的时候,说明加入了负数,此时不是最大子序列,所以maxend得清零,end的下标也得前移;如果maxend的值大于max的值,说明这个值可以用来更新,就是找到新的更大的值,此时max更新为maxend,start也更新,说明这是目前能够找到的最新的最大子序列。
代码如下:
public class Main {
static int start;
static int end;
public static int MaxSum(int[] arr){
int len=arr.length;
int max=arr[len-1];
int end=len-1;
int start=end;
int maxend=max;
for(int i=len-2;i>=0;i--){
if(maxend<0){
maxend=0;
end=i;
}
maxend+=arr[i];
if(maxend>max){
max=maxend;
start=i;
}
}
return max;
}
public static void main(String[] args){
int[] arr={2,3,5,-8,6,-4,6};
System.out.println(MaxSum(arr));
System.out.println("start="+start+",end="+end);
}
}
设立全局变量start和end的下标,是为了最后返回使用。