剑指offer三十之连续子数组的最大和

一、题目

  HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?(子向量的长度至少是1)

二、思路

情况一:数组中至少包含一个正数,

  这种情况下,将数组元素进行累加,如果累加和出现小于0的情况,则和最大的子序列肯定不可能包含前面的元素,这时将累加和置0,从下个元素重新开始累加,最后返回累加和即可。

情况二:数组中元素都为负数,则最大子数组和即为该数组里最大的那个元数的值。

三、代码

public class Solution {
    public int FindGreatestSumOfSubArray(int[] array) {

        int maxSum = 0;
        int curSum = 0;
        int maxNum = array[0];

        for (int i = 0; i < array.length; i++) {

            //情况一:数组中至少包含一个正数
            curSum += array[i];

            if (curSum > maxSum) {
                maxSum = curSum;
            }

            //如果累加和出现小于0的情况,则和最大的子序列肯定不可能包含前面的元素,这时将累加和置0,从下个元素重新开始累加

            if (curSum < 0) {
                curSum = 0;
            }

            //情况二:数组中元素都为负数,最大子数组的和即为该数组里最大的那个元素
            if (array[i] > maxNum) {
                maxNum = array[i];//数组中的最大值
            }
        }

        return maxNum > 0 ? maxSum : maxNum;
    }
}
View Code

----------------------------------------------------

参考链接:

https://www.nowcoder.com/practice/459bd355da1549fa8a49e350bf3df484?tpId=13&tqId=11183&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

posted @ 2017-10-11 20:33  hezhiyao  阅读(...)  评论(...编辑  收藏