問題描述:java
計算一個給定數組的最大子序列之和數組
求全部子數組的和的最大值。要求時間複雜度爲O(n)。this
例如輸入的數組爲1, -2, 3, 10, -4, 7, 2, -5,和最大的子數組爲3, 10, -4, 7, 2spa
所以輸出爲該子數組的和18。code
分析:
it
有三種方法:io
1,掃描3遍,能夠計算全部的子序列之和,可是複雜度爲N^3。class
2,掃描2遍,計算以任意元素開始的和,若是大於當前的最大值則將最大值付給它,複雜度爲N^2。date
3,掃描一遍,計算任意元素開始的值,若是小於零則清零,不然繼續日後加。file
代碼實現:
package oschina.IT100; /** * @project: DataStructureAndAlgorithmAnalysis * @filename: MaxSubSum * @version: 0.10 * @author: Jimmy Han * @date: 21:35 2015/7/7 * @comment: calculate the sum from any point, reset sum when current sum is negative * @result: 10 */ class IT3 { public static void main(String[] args){ int[] arr = {-1, 3, 2, -3, -1, 4, 5}; System.out.println(maxSubSum(arr)); } public static int maxSubSum( int[] a){ int maxSum = 0, thisSum = 0; for(int j = 0; j < a.length; j++){ thisSum += a[j]; if(thisSum > maxSum) maxSum = thisSum; else if(thisSum < 0) thisSum = 0; } return maxSum; } }