题目
输入一个整形数组,数组有正数也有负数,数组中一个或连续的多个整数组成一个子数组,求所有子数组的和的最大值。时间复杂度为o(n).
理解
刚开始想到的是暴力法,用三个循环,但是太费时了。之后想到如果一段子数组的和为0或者小于0,那肯定不会有这段数组。用动态规划听简单,就是刚开始自己没想全。用issum记录当前子序列的和,sum是最大子序列的和。
例如 1, -2, 3, 10, -4, 7, 2, -5
issum 1, -1, 3, 13, 9, 16, 18, 13
sum 1, 1,3, 13, 13, 16, 18, 18
代码
public class lianxi {
public static int fin(int []a) {
int issum=0,sum=0;
for(int i=0;i<a.length;i++){
if(issum>0)
issum+=a[i];
else
issum=a[i];
if(issum>sum)
sum=issum;
}
return sum;
}
public static void main(String[]args){
int []arr={1,-2,3,10,-4,7,2,-5};
System.out.println(fin(arr));
}
}