描述

输入一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。

数据范围:

alt

要求:时间复杂度为 O(n)O(n),空间复杂度为 O(n)O(n)

进阶:时间复杂度为 O(n)O(n),空间复杂度为 O(1)O(1)


题解1:规律分析

输入: [1,-2,3,10,-4,7,2,-5]

累加子数组和curSum分别为:1,-1,3,13,9,16,18,13

最大子数组和greaterSum为 1,1,3,13,13,16,18,18

所以,每当curSum<=0时候,curSum = array[i]

每当curSum<=0时候,curSum = curSum+array[i]

最后判断本次循环的值和上次子数组和谁大,那么greaterSum = max(curSum,greaterSum)

    int FindGreatestSumOfSubArray(vector<int> array) {
//         根据题意,数据范围n>1,所以不用考虑输入无效的情况
        int curSum = array[0];//记录累加的子数组和
        int greaterSum = array[0];//记录最大的子数组和
        for(int i =1;i<array.size();i++){
            if(curSum <=0) 
                curSum = array[i];
            else
                curSum+=array[i];
            if(curSum > greaterSum)
                greaterSum = curSum;
        }
        return greaterSum;
    }

题解2:动态规划

状态转移方程为:

当f(i-1)<=0,curSum = array[i]; 当f(i-1) >0,curSum =curSum + array[i];

动态规划最重要的是要记录上一次的值

    int FindGreatestSumOfSubArray(vector<int> array) {
        int curSum = 0;
        int result = array[0];
        for(int i =0;i<array.size();i++){
            if(curSum <= 0)
                curSum = array[i];
            else
                curSum +=array[i];
            result = max(curSum, result);
        }
        return result;
    }