【Offer】[42] 【连续子数组的最大和】
题目描述
输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。
思路分析
动态规划的思想,可总结为如下公式:
- 当以第i个数字结尾的子数组中所有数字的和 <0 时,如果把这个负数与第i个数累加,则得到的结果比第i个数字本身还要小,所以这种情况下以第i个数字结尾的子数组就是第i个数字本身;
- 如果以第i-1个数字结尾的子数组中所有数字的和 >0时,则与第i个数字累加就得到以第i个数字结尾的子数组中所有数字的和。
测试用例
- 功能测试:从数据流中读出奇数个数字:从数据流中读出偶数个数字。
- 边界值测试:从数据流中读出0个、1个、2个数字。
Java代码
public class Offer042 {
public static void main(String[] args) {
test1();
test2();
test3();
}
public static int FindGreatestSumOfSubArray(int[] array) {
return Solution1(array);
}
private static int Solution1(int[] array) {
if(array==null || array.length<=0) {
return 0;
}
int curSum = 0;
int maxSum = array[0];
for(int i=0;i<array.length;i++) {
if(curSum<=0) {
curSum=array[i];
}else{
curSum+=array[i];
}
if(curSum>maxSum) {
maxSum = curSum;
}
}
return maxSum;
}
private static void test1() {
int[] array ={6,-3,-2,7,-15,1,2,2};
int maxSum = FindGreatestSumOfSubArray(array);
System.out.println(maxSum);
}
private static void test2() {
}
private static void test3() {
}
}
代码链接
************ **供自己学习查阅使用(我只想静静的写篇博客,自我总结下[手动狗头]) by Pavel** *********