对于最大子序问题求解的四种算法的总结摘录笔记如下: 暴力法(使用三个循环,复杂度为O(n3)) public class MaxSum{ public static void main(String[] args){ int[] array={-3,4,6,-9,5,-12,3,5}; int maxSum=0; for(int i=0;i<array.length;i++){ for(int j=i;j<array.length;j++){ int thisSum=0; for(int k=i;k<j;k++) thisSum+=array[k]; if(thisSum>maxSum) maxSum=thisSum; } } System.out.println("the maxSum of :"+maxSum); } } 设法在第一个算法中折除一个循环 public class MaxSum{ public static void main(String[] args){ int[] array={-3,4,6,-9,5,-12,3,5}; int maxSum=0; for(int i=0;i<array.length;i++){ int thisSum=0; for(int j=i;j<array.length;j++){ thisSum+=array[j]; if(thisSum>maxSum) maxSum=thisSum; } } System.out.println("the maxSum of :"+maxSum); } } 采用分治法,再次将复杂度降为O(nlogn) private static int maxSumRec(int[] a,int left,int right){ if(left==right) //base case if(a[left]>0) return a[left]; else return 0; int center=(left+right)/2; int maxLeftSum=maxSumRec(a,left,center); int maxRightSum=maxSumRec(a,center+1,right); int maxLeftBorderSum=0,leftBorderSum=0; for(int i=center;i>=left;i--){ leftBorderSum+=a[i]; if(leftBorderSum>maxLeftBorderSum) maxLeftBorderSum=leftBorderSum; } int maxRightBorderSum=0,rightBorderSum=0; for(int i=center+1;i<=right;i++){ rightBorderSum+=a[i]; if(rightBorderSum>maxRightBorderSum) maxRightBorderSum=rightBorderSum; } return max3(maxLeftSum,maxRightSum,maxLeftBorderSum+maxRightBorderSum); } public static int maxSubSum3(int[] a){ return maxSumRec(a,0,a.length-1); } 算法4,复杂度O(n) public class MaxSum{ public static void main(String[] args){ int[] array={-3,4,6,-9,5,-12,3,5}; int maxSum=0,thisSum=0; for(int i=0;i<array.length;i++){ thisSum+=array[i]; if(thisSum>maxSum) maxSum=thisSum; else if(thisSum<0) thisSum=0; } System.out.println("the maxSum of :"+maxSum); } }