题目(来源)
给一个数组,返回它的最大连续子序列的和及其开始下标和结束下标。例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8,从第0个开始,到第3个为止。
动态规划
public void FindGreatestSumOfSubArray(int[] array) {
int preValue=0;
int max=Integer.MIN_VALUE;
int i=0,j=0,start=0,end=0;
for(;j<array.length;j++){
if(preValue<0){
i=j;
preValue=array[j];
}else{
preValue+=array[j];
}
if(preValue>max){
start=i;
end=j;
max=preValue;
}
}
System.out.println(start+" "+end+" "+max);
}
基本思想
preValue
保存前一次获取的最大值i
和j
指示当前计算区间start
和end
记录取得最大值的区间始末
只要preValue<0,无论j
指向的下一个元素大于还是小于0,都比preValue+array[j]要大,所以应该抛弃j
之前的元素