Maximum Continuous Subsequence Sum
最大连续子序列求和详解
1. 问题描述
输入一个整数序列(浮点数序列也适合本处讲的算法),求出其中连续子序列求和的最大值。
2. 算法分析
2.1. 算法一
2.1.1. 算法描述
遍历所有子序列并求和,比较得出其中的最大值。
2.1.2. 代码描述
1 public static int maxSubSumCubic(int[] array) {
2 int maxSum = 0; //最大子序列求和
3 //start表示要求和的子序列的开始索引,end表示结束索引
4 for(int start = 0; start < array.length; start++) {
5 for(int end = start; end < array.length; end++) {
6 int thisSum = 0; //当前子序列求和
7 //求出array[start]~array[end]子序列的和
8 for(int index = start; index <= end; index++) {
9 thisSum += array[index];
10 }
11 //判断是否大于之前得到的最大子序列求和
12 if(thisSum > maxSum) {
13 maxSum = thisSum;
14 }
15 }
16 }
17 return maxSum;
18 }
2.1.3. 算法分析
设输入序列长度为N,算法一有三个循环嵌套,第4行的循环长度为N。第5行的循环长度为N-start+1,因为我们考虑的是最差性能,所以可取为最大的N。第8行的循环长度是end-start+1,同理可取为N。所以可得算法的运行时间是O(N*N*N)=O(N^3 ),即算法的运行时间是以输入长度的立方增长的。可想而知,一旦输入长度变大,算法的运行效率将慢得无法接受,这也从反面说明了算法设计的重要性。
2.2. 算法二
2.2.1. 算法描述
算法设计的一个重要原则就是“不要重复做事”。在算法一中,对array[start]~array[end]子序列求和,可以由上一次求和array[start]~array[end-1]的结果加上array[end]得到,而不用从头开始计算。
2.2.2. 代码描述
1 public static int maxSubSumQuad