输入一个整形数组。数组中连续的一个或多个整数组成一个子数组,每一个子数组都有一个和。求全部子数组的和的最大值。
-
接口
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; }