剑指offer题目30:连续子数组的最大和

题目描述

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

解答思路

这题对于我来说真是困难。。用到了动态规划。。

迭代数组,每次累加原来的子数组的值,如果原来子数组的值小于0,则相加只会变得更小,从新开始,每次比对最大值和当前值,如果当前值大于最大值,则最大值变成当前值。

实现代码

class Solution {
public:
    int FindGreatestSumOfSubArray(vector<int> array) {
        if(array.empty()) {
            return 0;
        }

        int max = array[0];
        int cur = array[0];     // 当前数组

        int i = 1;
        while(i < array.size()) {
            //如果加上某个元素sum>=0的话,就加;
            //当数组全为负数的时候只要有加法就一定比原来的数小,此时就相当于找出数组内最大的数 
            cur = cur >= 0 ? cur + array[i] : array[i]; //否则从当前位置重新计算  
            max = cur > max ? cur : max;
            ++i;
        }

        return max;
    }
};

posted @ 2019-04-08 15:14  {-)大傻逼  阅读(205)  评论(0)    收藏  举报
欢迎转载,转载请注明本文地址。