输入一个整形数组,数组里可以有正数或负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。
思路:
1.最大子序列的开始元素一定是正数
2.最大子序列中任意一个元素开始往后累加到结束,这个和一定不会是负数
3.从头开始累加,如果累加和小于0,那么抛弃这一段累加,从新开始累加,累加过程中如果累加和大于当前累加和最大值sum,则更新sum以及开始和结束位置。在重置累加时更新当前累加的起始位置,在更新sum值是同步更新起始和结束位置。
实现:
function max_sum(arr) {
var begin, end, curBegin, max = sum = 0;
for (let i = 0; i < len; i++) {
if (sum <= 0) {
sum = arr[i];
curBegin = i;
} else {
sum += arr[i];
}
if (sum > max) {
max = sum;
begin = curBegin;
end = i;
}
}
return {
begin:begin,
end:end,
max:max
};
}