题目描述
输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n).
示例
输入
[1,-2,3,10,-4,7,2,-5]
返回值
18
说明
输入的数组为{1,-2,3,10,—4,7,2,一5},和最大的子数组为{3,10,一4,7,2},因此输出为该子数组的和 18。
思路
- 初始化:维护一个变量sum = 0
- 如果tmp+array[i] < 0, 说明以i结尾的不作贡献,重新赋值sum= 0
- 否则更新sum= sum+ array[i]
最后判断sum是否等于0, 如果等于0, 说明数组都是负数,选取一个最大值为答案。如下图所示
代码
function FindGreatestSumOfSubArray(array) {
if (array.length == 0) {
return 0;
}
let max = array[0];
let sum= 0;
for (let i = 0; i < array.length; i++) {
sum= sum+ array[i];
max = Math.max(max, sum);
if (sum< 0) {
//说明前面相加的为负数,就没有必要加上前面那段了
sum= 0;
}
}
return max;
}
运行环境:Javascript_V8
运行时间:8ms
占用内存:5240KB