# 题目描述
输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值,要求时间复杂度为O(n)
例如:[6,-3,-2,7,-15,1,2,2]
,连续子向量的最大和为8(从第0个开始,到第3个为止)。
# 解题思路
解题方法有很多种,但这里要求时间负责度为O(n)
,那也是要求要在一个for
循环中搞定.
- 定义一个连续子数组的最大值
max
; - 定义一个连续子数组的和
sum
; - 前两个定义的默认值都是数组第一项, 然后从第二项开始累加;
- 判断每次累加的和
sum
是否大于0
,若是大于0
才对后面的累加有贡献,若小于0
则sum
从当前值开始重新开始; - 比较每次循环的
max
和sum
的大小,取大的.
# coding
function findGreatestSumOfSubArray(array) {
if (array && array.length > 0) {
let sum = array[0],
max = array[0];
for (let i = 1; i < array.length; i++) {
if (sum < 0) {
sum = array[i];
} else {
sum += array[i];
}
if (sum > max) max = sum;
}
return max;
}
return 0;
}
测试代码
console.log(findGreatestSumOfSubArray([-2, 6, 7, 8, -3, 4, -6]))
// 22 (6+7+8)
阅读全文