最大子串和

2016-07-31 craneyuan 更多博文 » 博客 » GitHub »

原文链接 https://crane-yuan.github.io/2016/07/31/The-max-sub-sum/
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


问题描述

在长度为N的整形数组中,求连续子串的和的最大值。

例如:1 2 4 5 -11 5 -3,结果为6。

注意:要考虑到数组中元素都为负数的情况。

O(n)解法

public static int maxSubSum(int[] a) {
    int maxSum = a[0];
    int curSum = 0;
    for (int j = 0; j < a.length; j++) {
        curSum += a[j];
        if (curSum > maxSum) {
            maxSum = curSum;
        } else if (curSum < 0) {
            curSum = 0;
        }
    }
    return maxSum;
}

本算法的关键在于,对于一个子序列,如果其和为负数,则不可能作为最大子串的前缀。