求一个数组的连续子数组的最大和

输入一个整型数组,数组中有正有负。数组中的一个或多个整数组成一个子数组。求所有子数组的和的最大值,要求时间复杂度为O(n)。

首先,根据题意,可能我们都会想到枚举数组中所有的子数组的和。我们都知道一个长度为n的数组,总共有n(n+1)/2个子数组。计算出所有子数组的和需要O(n^2)时间。

我们先来举例分析下数组的规律,给出一个数组{1,-2,3,10,-4,7,2,-5}。

步骤操作累加的子数组和最大子数组的和
1加111
-2加-2-11
3抛弃前面累加的子数组和-1,并加333
10加101313
-4加-4913
7加71616
2加21818
-5加-51318

从上表可以看出一旦累加的子数组和为负时,我们应当抛弃当前子数组和,最大子数组和始终保持最大的。根据上表,我们的代码如下所示。

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

因只有一个循环,因此时间复杂度满足题目要求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值