abcdefg,设定初始和sum=a.
- 如果a+b<b,sum变小,舍弃a,下一轮从b+c开始,如果b>sum,sum=b
- 如果a+b>b,sum变大,下一轮从a+b+c开始,如果a+b>sum,sum=a+b
public class Solution {
public int FindGreatestSumOfSubArray(int[] array) {
// return nornal(array);
// return dp(array);
return optDp(array);
}
// 超时
public int normal(int[] array){
int max = array[0];
for(int i=0;i<array.length;i++){
int sum = 0;
for(int j=i;j<array.length;j++){
sum+=array[j];
if(max<sum)max=sum;
}
}
return max;
}
// dp存放下标截止的最大和
public int dp(int[] array){
int[] dp = new int[array.length];
int max = array[0];
dp[0] = array[0];
for(int i=1;i<array.length;i++){
dp[i] = dp[i-1]+array[i];
if(dp[i]<array[i])dp[i]=array[i];
if(max<dp[i])max=dp[i];
}
return max;
}
// 优化方案
public int optDp(int[] array){
int max = array[0];
int sum=0;
for(int i=0;i<array.length;i++){
sum = Math.max(sum+array[i],array[i]);
max = Math.max(sum,max);
}
return max;
}
}