输入一个整形数组。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。
-
接口
Int GetSubArraySum(Int* pIntArray,Int nCount);
-
规格
要求时间复杂度为O(n)
-
举例
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
因此输出为该子数组的和18
华为OJ上的这道题目与算法导论中最大子序列求和略微不同,在这里没有规定如果数组全为负数的话那么我们就定义最大子序列和为0.
所以要先对这种情况加以判断,然后在运用动态规划里的知识,在时间复杂度为n下进行运算.
完整代码如下:
#include <stdlib.h>
#include <string.h>
#include "oj.h"
/*
功能:
输入:pIntArray:数组,nCout:数组长度
输出:
返回:返回最大值
*/
int GetSubArraySum(int* pIntArray, int nCount)
{
/*在这里实现功能*/
if(pIntArray==NULL||nCount<1)
return -1;
int b=0,cnt=0,a=pIntArray[0];
//全是负数的情形
for(int i=0;i<nCount;i++)
{
if(pIntArray[i]<0)
cnt++;
if(a<pIntArray[i])
a=pIntArray[i];
}
if(cnt==nCount)
return a;
int ThisSum,MaxSum,j;
ThisSum = MaxSum =0;
for(j = 0;j < nCount;j++)
{
ThisSum += pIntArray[j];
if(ThisSum > MaxSum)
MaxSum = ThisSum;
else if(ThisSum < 0)
ThisSum = 0;
}
return MaxSum;
}