原题:给定一个数组,其中元素有正,也有负,找出其中一个连续子序列,使和最大;
不想说明什么,我们数据结构老师第一节课就给我们讲这个,以前给实现过一个暴力算法版的算法复杂度O(n2),现在实现一个动态规划版的;
/* *
* 求解最大子序列和问题O(n)算法;
* @param array
*/
public static void maxSubSum(int[] array){
// 只遍历一遍;
int curSum = 0; // 当前和;
int maxSum = 0; // 最大和;
int start = 0; // 起始;
int end = 0; // 终止;
int testStart = 0; // 测试的开始序列;
for(int i = 0; i < array.length; i++){
curSum += array[i];
if(curSum > maxSum){
start = testStart;
end = i;
maxSum = curSum;
}else if(curSum < 0){
testStart = i + 1;
curSum = 0;
}
}
System.out.println("最大自序列和是:"+maxSum);
System.out.println("start:" + start + ", end: " + end);
System.out.print("自序列是:");
for(int i = start; i <= end; i++){
System.out.print(array[i] + " ");
}
System.out.println();
}
其基本思想就是拥有最大自序列和的数组不可能是以负数开始的,所以如果当前和小于0,那么字数组必定向前推进1,而其他情况下不会改变最大和和起始终止位置。比起暴力版的这个好啊算法复杂度为O(n)。
<!--EndFragment-->