穷举法:
穷举法:
例:
1 -2 4 3 -1 -4
j=0 1到-4找最大子序列、保存下标start、end
j=1 -2到-4..
j=2 4到-4..
.
j=5
此算法遍历了所有情况、时间复杂度为O(n2)
public void find(int[] array){
int maxSum=array[0];
int currentSum=0;
int start=0;//记录最大值的开始与结尾
int end=0;
for(int i=0;i<array.length;i++){
for(int j=i;j<array.length;j++){
currentSum+=array[j];
if(currentSum>maxSum){
maxSum=currentSum;
start=i;
end=j;
}
currentSum=0;
}
}
for(int i=start;i<=end;i++){
System.out.print(array[i]);
if(i!=end){
System.out.print(",");
}
}
}
动态规划:
例:
1 -2 4 3 -1 -4
sum 1 -1 4 7 6 2
思路:动态归化时将问题化解为几个相互关联的问题、分解复杂度。
若sum[i-1]>0,则最大值为sum[i]=sum[i-1]+array[i]
否则为sum[i]=array[i]并更新start。
判断lastSum与maxSum,更新end
public static void find(int[] array){
int lastSum=0;
int maxSum=array[0];
int start=0;
int end=0;
for(int i=0;i<array.length;i++){
//lastSum最大和
if(lastSum>0){
lastSum=lastSum+array[i];
}else{
lastSum=array[i];
start=i;
}
//若大于则更新
if(maxSum<lastSum){
maxSum=lastSum;
end=i;
}
}
for(int i=start;i<=end;i++){
System.out.print(array[i]);
if(i!=end){
System.out.print(",");
}
}
}