public class Solution { public int maxSubArray(int[] array){ return dpImpl(array); } private int dpImpl(int[] array){ Result[] results=new Result[array.length+1]; results[0]=new Result(array[0],0); for(int i=1;i<array.length;i++){ if(results[i-1].maxsum<0){ if(results[i-1].maxsum<array[i]){ results[i]=new Result(array[i],i); }else{ results[i]=results[i-1]; } }else{ int temp=sum(array,results[i-1].endIdx+1,i); if(temp>=0){ results[i]=new Result(results[i-1].maxsum+temp,i); }else{ results[i]=results[i-1]; } } } return results[array.length-1].maxsum; } //因java不支持多返回值,使用类Result代替 static class Result{ int maxsum; int endIdx; public Result(int maxsum, int endIdx) { this.maxsum = maxsum; this.endIdx = endIdx; } } private int oneLoop(int[] array){ int idx=getNonNegativeIndex(array,0); if(idx==-1){ return max(array,0); } int max=array[idx],curMax=max; for(int i=idx+1;i<array.length;i++){ curMax+=array[i]; if(curMax>max){ max=curMax; } if(curMax<0){ curMax=0; } } return max; } private int max(int[] array,int begin){ int max=array[begin]; for(int i=begin;i<array.length;i++){ if(max<array[i]){ max=array[i]; } } return max; } private int twoLoop(int[] array){ int sum=Integer.MIN_VALUE,maxSum=Integer.MIN_VALUE; for(int i=0;i<array.length;i++){ for(int j=i;j<array.length;j++){ sum=sum(array,i,j); if(sum>maxSum){ maxSum=sum; } } } return maxSum; } private int sum(int[] array,int begin,int end){ int sum=0; for(int i=begin;i<=end;i++){ sum+=array[i]; } return sum; } private int getNonNegativeIndex(int[] array,int begin){ for(int i=begin;i<array.length;i++){ if(array[i]>=0){ return i; } } return -1; } }