【剑指offer】42、连续子数组的最大和

题目

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

思路一

试着从头到尾累加每个数字,若发现有子数组和小于零,则加上后面的数字肯定会变小

因此丢弃这组子数组,从后面一个数字开始重新累加

例如{1,-2,3,10,-4,7,2,-5}

1+(-2)=-1

3+10-4+7+2=18

3+10-4+7+2-5=13

因此是18

需要注意的是,记录最大值的初始值要设置成INT_MIN,因为最大值可能是负数。

class Solution {
public:
    int FindGreatestSumOfSubArray(vector<int> array) {
        if (array.size() == 0)
            return 0;
        // 数组中最大值可以是负数,因此最大值不能设成0
        int sum = 0, max = INT_MIN; 
        int len = array.size();
        for (int i = 0; i < len; i++){
            if (sum < 0){
                sum = array[i];  // 从下一个数字开始累加
            }
            else {
                sum = sum + array[i];
            }
            if (sum > max){  // 记录最大值
                max = sum;
            }
        }
        return max;
    }
};

思路二

也可以用动态规划做,其实和前面思想类似。

用f(i)表示以i结尾的子数组最大和

class Solution {
public:
    int FindGreatestSumOfSubArray(vector<int> array) {
        if (array.size() == 0)
            return 0;
        int f = array[0], sum = array[0];
        for (int i = 1; i < array.size(); i++){
            if (f <= 0)
                f = array[i];
            else
                f = f + array[i];
            sum = (f > sum)? f: sum;
        }
        return sum;
    }
};

猜你喜欢

转载自www.cnblogs.com/shiganquan/p/9346322.html