输入一个整型数组,数组中有正有负。数组中的一个或多个整数组成一个子数组。求所有子数组的和的最大值,要求时间复杂度为O(n)。
首先,根据题意,可能我们都会想到枚举数组中所有的子数组的和。我们都知道一个长度为n的数组,总共有n(n+1)/2个子数组。计算出所有子数组的和需要O(n^2)时间。
我们先来举例分析下数组的规律,给出一个数组{1,-2,3,10,-4,7,2,-5}。
步骤 | 操作 | 累加的子数组和 | 最大子数组的和 |
1 | 加1 | 1 | 1 |
-2 | 加-2 | -1 | 1 |
3 | 抛弃前面累加的子数组和-1,并加3 | 3 | 3 |
10 | 加10 | 13 | 13 |
-4 | 加-4 | 9 | 13 |
7 | 加7 | 16 | 16 |
2 | 加2 | 18 | 18 |
-5 | 加-5 | 13 | 18 |
从上表可以看出一旦累加的子数组和为负时,我们应当抛弃当前子数组和,最大子数组和始终保持最大的。根据上表,我们的代码如下所示。
function theBigSumStr(arr) {
var maxSum = arr[0];
var sum =0;
for(var i =0,L = arr.length; i < L; i++){
if(sum <= 0){
sum = arr[i];
} else {
sum += arr[i];
}
if(sum > maxSum){
maxSum = sum;
}
}
return maxSum;
}
var arr = [1,-2,3,10,-4,7,2,-5];
console.log(theBigSumStr(arr)); //18
因只有一个循环,因此时间复杂度满足题目要求。