1、题目:
输入一个整型数组,数组里有正整数也有负数。数组中一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n).
如数组为{1,-2,3,10,-4,7,2,-5}和最大子数组为{3,10,-4,7,2},因此输出为该子数组的和为18.
2、思路一:直接分析
我们可以通过从头到尾逐个累加数组中的每个数字,当累加到某一个数字后,如果累加后和的值比最后一次累加的数字还要小的话,就抛弃前面累加和的值(即不用考虑前面的子数组),并从最后一次累加的值开始往下累加。
参考程序代码:
bool Invalid = false;//因为可能子数组的最大值为0,所以需要全局变量来标记输入是否无效
int FindMaxArraySum(int* pData, int length){
if((pData == NULL )||(length <= 0))
{
Invalid = true; //表示输入无效,返回值为0
return 0;
}
Invalid = false;
int CurrSum = 0;
int MaxSum =0x80000000;
for(int i =0;i<length;i++)
{
if(CurrSum <= 0)//如果下一次累加后的值小于0,则抛弃前面的累加结果,从新开始累加
CurrSum = pData[i];
else
CurrSum += pData[i];
if(CurrSum > MaxSum)
MaxSum = CurrSum;
}
return MaxSum;
}
3、思路二、动态规划思想
其思路与上述异曲同工之效,就是显得高大上了一点,这里就不再累赘。